- add libbb function str_tolower to convert a string to lowercase.
[oweals/busybox.git] / coreutils / uudecode.c
index 06b2fc1c1b26354d4878b5bedce5d10dcac84eb7..c195a3e6f96b6e5afb4abf9557bded6e5be24fb3 100644 (file)
  */
 
 
-#include <stdio.h>
-#include <errno.h>
-#include <getopt.h> /* optind */
-#include <string.h>
-#include <stdlib.h>
 #include "busybox.h"
 
-static int read_stduu(FILE *src_stream, FILE *dst_stream)
+static void read_stduu(FILE *src_stream, FILE *dst_stream)
 {
        char *line;
 
-       while ((line = bb_get_chomped_line_from_file(src_stream)) != NULL) {
+       while ((line = xmalloc_getline(src_stream)) != NULL) {
                int length;
                char *line_ptr = line;
 
                if (strcmp(line, "end") == 0) {
-                       return(EXIT_SUCCESS);
+                       return;
                }
                length = ((*line_ptr - 0x20) & 0x3f)* 4 / 3;
 
@@ -37,13 +32,13 @@ static int read_stduu(FILE *src_stream, FILE *dst_stream)
                        continue;
                }
                if (length > 60) {
-                       bb_error_msg_and_die("Line too long");
+                       bb_error_msg_and_die("line too long");
                }
 
                line_ptr++;
-               /* Tolerate an overly long line to acomadate a possible exta '`' */
+               /* Tolerate an overly long line to accomodate a possible exta '`' */
                if (strlen(line_ptr) < (size_t)length) {
-                       bb_error_msg_and_die("Short file");
+                       bb_error_msg_and_die("short file");
                }
 
                while (length > 0) {
@@ -68,14 +63,14 @@ static int read_stduu(FILE *src_stream, FILE *dst_stream)
                }
                free(line);
        }
-       bb_error_msg_and_die("Short file");
+       bb_error_msg_and_die("short file");
 }
 
-static int read_base64(FILE *src_stream, FILE *dst_stream)
+static void read_base64(FILE *src_stream, FILE *dst_stream)
 {
        static const char base64_table[] =
                "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n";
-       char term_count = 0;
+       int term_count = 0;
 
        while (1) {
                char translated[4];
@@ -89,7 +84,7 @@ static int read_base64(FILE *src_stream, FILE *dst_stream)
                        do {
                                ch = fgetc(src_stream);
                                if (ch == EOF) {
-                                       bb_error_msg_and_die("Short file");
+                                       bb_error_msg_and_die("short file");
                                }
                        } while ((table_ptr = strchr(base64_table, ch)) == NULL);
 
@@ -106,7 +101,7 @@ static int read_base64(FILE *src_stream, FILE *dst_stream)
                        else if (*table_ptr == '\n') {
                                /* Check for terminating line */
                                if (term_count == 5) {
-                                       return(EXIT_SUCCESS);
+                                       return;
                                }
                                term_count = 1;
                                continue;
@@ -128,27 +123,29 @@ static int read_base64(FILE *src_stream, FILE *dst_stream)
        }
 }
 
+int uudecode_main(int argc, char **argv);
 int uudecode_main(int argc, char **argv)
 {
-       int (*decode_fn_ptr) (FILE * src, FILE * dst);
        FILE *src_stream;
        char *outname = NULL;
        char *line;
-       int opt;
 
-       opt = bb_getopt_ulflags(argc, argv, "o:", &outname);
+       getopt32(argc, argv, "o:", &outname);
 
        if (optind == argc) {
                src_stream = stdin;
        } else if (optind + 1 == argc) {
-               src_stream = bb_xfopen(argv[optind], "r");
+               src_stream = xfopen(argv[optind], "r");
        } else {
                bb_show_usage();
        }
 
        /* Search for the start of the encoding */
-       while ((line = bb_get_chomped_line_from_file(src_stream)) != NULL) {
-               char *line_ptr = NULL;
+       while ((line = xmalloc_getline(src_stream)) != NULL) {
+               void (*decode_fn_ptr)(FILE * src, FILE * dst);
+               char *line_ptr;
+               FILE *dst_stream;
+               int mode;
 
                if (strncmp(line, "begin-base64 ", 13) == 0) {
                        line_ptr = line + 13;
@@ -156,33 +153,29 @@ int uudecode_main(int argc, char **argv)
                } else if (strncmp(line, "begin ", 6) == 0) {
                        line_ptr = line + 6;
                        decode_fn_ptr = read_stduu;
+               } else {
+                       free(line);
+                       continue;
                }
 
-               if (line_ptr) {
-                       FILE *dst_stream;
-                       int mode;
-                       int ret;
-
-                       mode = strtoul(line_ptr, NULL, 8);
-                       if (outname == NULL) {
-                               outname = strchr(line_ptr, ' ');
-                               if ((outname == NULL) || (*outname == '\0')) {
-                                       break;
-                               }
-                               outname++;
-                       }
-                       if (strcmp(outname, "-") == 0) {
-                               dst_stream = stdout;
-                       } else {
-                               dst_stream = bb_xfopen(outname, "w");
-                               chmod(outname, mode & (S_IRWXU | S_IRWXG | S_IRWXO));
+               mode = strtoul(line_ptr, NULL, 8);
+               if (outname == NULL) {
+                       outname = strchr(line_ptr, ' ');
+                       if ((outname == NULL) || (*outname == '\0')) {
+                               break;
                        }
-                       free(line);
-                       ret = decode_fn_ptr(src_stream, dst_stream);
-                       bb_fclose_nonstdin(src_stream);
-                       return(ret);
+                       outname++;
+               }
+               if (LONE_DASH(outname)) {
+                       dst_stream = stdout;
+               } else {
+                       dst_stream = xfopen(outname, "w");
+                       chmod(outname, mode & (S_IRWXU | S_IRWXG | S_IRWXO));
                }
                free(line);
+               decode_fn_ptr(src_stream, dst_stream);
+               fclose_if_not_stdin(src_stream);
+               return EXIT_SUCCESS;
        }
-       bb_error_msg_and_die("No `begin' line");
+       bb_error_msg_and_die("no 'begin' line");
 }