diff options
-rw-r--r-- | coreutils/dos2unix.c | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/coreutils/dos2unix.c b/coreutils/dos2unix.c index df0b4f977..3488f3354 100644 --- a/coreutils/dos2unix.c +++ b/coreutils/dos2unix.c @@ -35,28 +35,24 @@ #include <sys/time.h> #include "busybox.h" -#define CT_AUTO 0 #define CT_UNIX2DOS 1 #define CT_DOS2UNIX 2 /* We are making a lame pseudo-random string generator here. in * convert(), each pass through the while loop will add more and more * stuff into value, which is _supposed_ to wrap. We don't care about - * it being accurate. We care about it being messy, since we then mod - * it by the sizeof(letters) and then use that as an index into letters + * it being accurate. We care about it being messy, since we use it * to pick a random letter to add to out temporary file. */ typedef unsigned long int bb_uint64_t; -static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - -// if fn is NULL then input is stdin and output is stdout +/* if fn is NULL then input is stdin and output is stdout */ static int convert(char *fn, int ConvType) { int c, fd; struct timeval tv; - char tempFn[BUFSIZ]; + RESERVE_CONFIG_BUFFER(tempFn, BUFSIZ); static bb_uint64_t value=0; - FILE *in = stdin, *out = stdout; + FILE *in, *out; if (fn != NULL) { in = bb_xfopen(fn, "rw"); @@ -73,7 +69,9 @@ static int convert(char *fn, int ConvType) * the input file... */ gettimeofday (&tv, NULL); value += ((bb_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid (); - tempFn[++c] = letters[value % 62]; + tempFn[++c] = ((value%62) < 26)?(value%62)+97: + ((value%62) < 52)?(value%62)+39: + (value%62)-4; tempFn[c+1] = '\0'; value /= 62; @@ -88,12 +86,16 @@ static int convert(char *fn, int ConvType) } break; } + } else { + in = stdin; + out = stdout; } while ((c = fgetc(in)) != EOF) { if (c == '\r') { if ((ConvType == CT_UNIX2DOS) && (fn != NULL)) { - // file is alredy in DOS format so it is not necessery to touch it + /* file is already in DOS format so it is + * not necessary to touch it. */ remove(tempFn); if (fclose(in) < 0 || fclose(out) < 0) { bb_perror_nomsg(); @@ -101,13 +103,12 @@ static int convert(char *fn, int ConvType) } return 0; } - if (!ConvType) - ConvType = CT_DOS2UNIX; break; } if (c == '\n') { if ((ConvType == CT_DOS2UNIX) && (fn != NULL)) { - // file is alredy in UNIX format so it is not necessery to touch it + /* file is already in DOS format so it is + * not necessary to touch it. */ remove(tempFn); if ((fclose(in) < 0) || (fclose(out) < 0)) { bb_perror_nomsg(); @@ -115,27 +116,21 @@ static int convert(char *fn, int ConvType) } return 0; } - if (!ConvType) { - ConvType = CT_UNIX2DOS; - } if (ConvType == CT_UNIX2DOS) { fputc('\r', out); } - fputc('\n', out); - break; } fputc(c, out); } - if (c != EOF) - while ((c = fgetc(in)) != EOF) { - if (c == '\r') - continue; - if (c == '\n') { - if (ConvType == CT_UNIX2DOS) - fputc('\r', out); - fputc('\n', out); - continue; - } + while (c != EOF && (c = fgetc(in)) != EOF) { + if (c == '\r') + continue; + if (c == '\n') { + if (ConvType == CT_UNIX2DOS) + fputc('\r', out); + fputc('\n', out); + continue; + } fputc(c, out); } @@ -160,30 +155,23 @@ static int convert(char *fn, int ConvType) int dos2unix_main(int argc, char *argv[]) { - int ConvType = CT_AUTO; + int ConvType; int o; - //See if we are supposed to be doing dos2unix or unix2dos + /* See if we are supposed to be doing dos2unix or unix2dos */ if (argv[0][0]=='d') { ConvType = CT_DOS2UNIX; - } - if (argv[0][0]=='u') { + } else { ConvType = CT_UNIX2DOS; } - // process parameters - while ((o = getopt(argc, argv, "du")) != EOF) { - switch (o) { - case 'd': - ConvType = CT_UNIX2DOS; - break; - case 'u': - ConvType = CT_DOS2UNIX; - break; - default: - bb_show_usage(); - } - } + /* process parameters */ + o = bb_getopt_ulflags(argc, argv, "ud"); + + /* Do the conversion requested by an argument else do the default + * conversion depending on our name. */ + if (o) + ConvType = o; if (optind < argc) { while(optind < argc) |