Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/libbb/uuencode.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/libbb/uuencode.c
r1765 r2725 1 1 /* vi: set sw=4 ts=4: */ 2 2 /* 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 4 6 * 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. 6 8 */ 7 9 … … 40 42 * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3)) 41 43 */ 42 void bb_uuencode(char *p, const void *src, int length, const char *tbl)44 void FAST_FUNC bb_uuencode(char *p, const void *src, int length, const char *tbl) 43 45 { 44 46 const unsigned char *s = src; … … 70 72 } 71 73 } 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 */ 80 void 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.