diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/pending/uudecode.c | 72 |
1 files changed, 33 insertions, 39 deletions
diff --git a/toys/pending/uudecode.c b/toys/pending/uudecode.c index 41d9acf3..ffdd63e1 100644 --- a/toys/pending/uudecode.c +++ b/toys/pending/uudecode.c @@ -4,16 +4,17 @@ * * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/uudecode.html -USE_UUENCODE(NEWTOY(uudecode, ">2o:", TOYFLAG_USR|TOYFLAG_BIN)) +USE_UUDECODE(NEWTOY(uudecode, ">2o:", TOYFLAG_USR|TOYFLAG_BIN)) config UUDECODE bool "uudecode" default n help - usage: uudecode [-o outfile] [file] + usage: uudecode [-o OUTFILE] [INFILE] - Uudecode or base64-decode stdin or [file], sending output to outfile or - filename specified by input. + Decode file from stdin (or INFILE). + + -o write to OUTFILE instead of filename in header */ #define FOR_uudecode @@ -30,11 +31,6 @@ GLOBALS( * We can make a table of 16*5 entries to cover 0x2B - 0x7A */ -static inline int startswith(const char *a, const char *b) -{ - return (0==strncmp(a,b,strlen(b))); -} - static inline signed char uudecode_b64_1byte(char in) { char ret; @@ -50,11 +46,13 @@ static inline signed char uudecode_b64_1byte(char in) -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 }; + in &= 0x7f; if (in < '+') return -1; if (in > 'z') return -1; in -= '+'; ret = table[in]; + return ret; }; @@ -62,9 +60,10 @@ static inline signed char uudecode_b64_1byte(char in) /* Returns length put in out */ static int uudecode_b64_4bytes(char *out, const char *in) { - unsigned int i,x=0; - signed char b0,b1,b2,b3; + unsigned int i, x=0; + signed char b0, b1, b2, b3; int len = 3; + b0 = uudecode_b64_1byte(in[0]); b1 = uudecode_b64_1byte(in[1]); b2 = uudecode_b64_1byte(in[2]); @@ -73,9 +72,8 @@ static int uudecode_b64_4bytes(char *out, const char *in) if (b3 < 0) len--; if (b2 < 0) len--; x = ((b0 & 0x3f)<<18) | ((b1 & 0x3f)<<12) | ((b2 & 0x3f) << 6) | (b3 & 0x3f); - for (i = 0; i < len; i++) { - *out++ = (x>>(8*(2-i))) & 0x0ff; - } + for (i = 0; i < len; i++) *out++ = (x>>(8*(2-i))) & 0x0ff; + return len; } @@ -83,6 +81,7 @@ static void uudecode_b64_line(int ofd, const char *in, int ilen) { int olen; char out[4]; + while (ilen >= 4) { olen = uudecode_b64_4bytes(out,in); xwrite(ofd,out,olen); @@ -95,9 +94,10 @@ static void uudecode_b64(int ifd, int ofd) { int len; char *line; + while ((line = get_line(ifd)) != NULL) { - if (startswith(line,"====")) return; - if ((len = strlen(line)) < 4) continue; // skip empty lines + if ((len = strlen(line)) < 4) continue; + if (!strncmp(line, "====", 4)) return; uudecode_b64_line(ofd,line,len); free(line); } @@ -107,19 +107,17 @@ static void uudecode_b64(int ifd, int ofd) static void uudecode_uu_4bytes(char *out, const char *in, int len) { unsigned int i,x=0; - for (i = 0; i < 4; i++) { - x |= ((in[i] - 32) & 0x03f) << (6*(3-i)); - } + + for (i = 0; i < 4; i++) x |= ((in[i] - 32) & 0x03f) << (6*(3-i)); if (len > 3) len = 3; - for (i = 0; i < len; i++) { - *out++ = x >> (8*(2-i)); - } + for (i = 0; i < len; i++) *out++ = x >> (8*(2-i)); } static void uudecode_uu_line(int ofd, const char *in) { int olen = in[0] - 32; char buf[4]; + in++; while (olen > 0) { uudecode_uu_4bytes(buf,in,olen); @@ -132,9 +130,10 @@ static void uudecode_uu_line(int ofd, const char *in) static void uudecode_uu(int ifd, int ofd) { char *line = NULL; + while ((line = get_line(ifd)) != NULL) { if (line[0] == '`') break; - if (startswith(line,"end")) break; + if (!strncmp(line, "end", 3)) break; if (strlen(line) < 1) break; uudecode_uu_line(ofd,line); free(line); @@ -143,33 +142,28 @@ static void uudecode_uu(int ifd, int ofd) void uudecode_main(void) { - char *out_filename = NULL; - int ifd = 0; /* STDIN */ - int ofd = 1; /* STDOUT */ - char *line; - char *p,*p2; + int ifd = 0, ofd = 1; + char *out_filename = NULL, *line, *p,*p2; void (*decoder)(int ifd, int ofd) = NULL; long mode = 0744; - if (toys.optc == 1) { - ifd = xopen(toys.optargs[0],O_RDONLY); // dies if error - } + + if (toys.optc == 1) ifd = xopen(toys.optargs[0],O_RDONLY); + do { if ((line = get_line(ifd)) == NULL) perror_exit("empty file"); } while (strlen(line) == 0); /* skip over empty lines */ - if (startswith(line,"begin ")) decoder = uudecode_uu; - else if (startswith(line,"begin-base64 ")) decoder = uudecode_b64; + if (!strncmp(line, "begin ", 6)) decoder = uudecode_uu; + else if (!strncmp(line, "begin-base64 ", 13)) decoder = uudecode_b64; else perror_exit("not a valid uu- or base64-encoded file"); for (p = line; !isspace(*p); p++) /* skip first part */; for (; isspace(*p); p++) /* skip spaces */; mode = strtoul(p,&p2,8); p = p2 + 1; /* skip space */ - if (toys.optflags & FLAG_o) { - out_filename = TT.o; - } else { - out_filename = p; - } + if (toys.optflags & FLAG_o) out_filename = TT.o; + else out_filename = p; + ofd = xcreate(out_filename,O_WRONLY|O_CREAT|O_TRUNC,mode); free(line); decoder(ifd,ofd); - if (TOYBOX_CLEANUP) close(ofd); + if (CFG_TOYBOX_FREE) close(ofd); } |