Ignore:
Timestamp:
Feb 25, 2011, 9:26:54 PM (13 years ago)
Author:
Bruno Cornec
Message:
  • Update mindi-busybox to 1.18.3 to avoid problems with the tar command which is now failing on recent versions with busybox 1.7.3
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.9/mindi-busybox/libbb/uuencode.c

    r1765 r2725  
    11/* vi: set sw=4 ts=4: */
    22/*
    3  * Copyright 2006 Rob Landley <rob@landley.net>
     3 * Copyright 2003, Glenn McGrath
     4 * Copyright 2006, Rob Landley <rob@landley.net>
     5 * Copyright 2010, Denys Vlasenko
    46 *
    5  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
     7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
    68 */
    79
     
    4042 * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3))
    4143 */
    42 void bb_uuencode(char *p, const void *src, int length, const char *tbl)
     44void FAST_FUNC bb_uuencode(char *p, const void *src, int length, const char *tbl)
    4345{
    4446    const unsigned char *s = src;
     
    7072    }
    7173}
     74
     75/*
     76 * Decode base64 encoded stream.
     77 * Can stop on EOF, specified char, or on uuencode-style "====" line:
     78 * flags argument controls it.
     79 */
     80void FAST_FUNC read_base64(FILE *src_stream, FILE *dst_stream, int flags)
     81{
     82/* Note that EOF _can_ be passed as exit_char too */
     83#define exit_char    ((int)(signed char)flags)
     84#define uu_style_end (flags & BASE64_FLAG_UU_STOP)
     85
     86    int term_count = 0;
     87
     88    while (1) {
     89        unsigned char translated[4];
     90        int count = 0;
     91
     92        /* Process one group of 4 chars */
     93        while (count < 4) {
     94            char *table_ptr;
     95            int ch;
     96
     97            /* Get next _valid_ character.
     98             * bb_uuenc_tbl_base64[] contains this string:
     99             *  0         1         2         3         4         5         6
     100             *  012345678901234567890123456789012345678901234567890123456789012345
     101             * "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n"
     102             */
     103            do {
     104                ch = fgetc(src_stream);
     105                if (ch == exit_char && count == 0)
     106                    return;
     107                if (ch == EOF)
     108                    bb_error_msg_and_die("truncated base64 input");
     109                table_ptr = strchr(bb_uuenc_tbl_base64, ch);
     110//TODO: add BASE64_FLAG_foo to die on bad char?
     111//Note that then we may need to still allow '\r' (for mail processing)
     112            } while (!table_ptr);
     113
     114            /* Convert encoded character to decimal */
     115            ch = table_ptr - bb_uuenc_tbl_base64;
     116
     117            if (ch == 65 /* '\n' */) {
     118                /* Terminating "====" line? */
     119                if (uu_style_end && term_count == 4)
     120                    return; /* yes */
     121                term_count = 0;
     122                continue;
     123            }
     124            /* ch is 64 if char was '=', otherwise 0..63 */
     125            translated[count] = ch & 63; /* 64 -> 0 */
     126            if (ch == 64) {
     127                term_count++;
     128                break;
     129            }
     130            count++;
     131            term_count = 0;
     132        }
     133
     134        /* Merge 6 bit chars to 8 bit.
     135         * count can be < 4 when we decode the tail:
     136         * "eQ==" -> "y", not "y NUL NUL"
     137         */
     138        if (count > 1)
     139            fputc(translated[0] << 2 | translated[1] >> 4, dst_stream);
     140        if (count > 2)
     141            fputc(translated[1] << 4 | translated[2] >> 2, dst_stream);
     142        if (count > 3)
     143            fputc(translated[2] << 6 | translated[3], dst_stream);
     144    } /* while (1) */
     145}
Note: See TracChangeset for help on using the changeset viewer.