Bernhard Fischer trimmed down dos2unix a bit.

This commit is contained in:
Rob Landley 2005-09-01 03:11:19 +00:00
parent 078bacf1e9
commit f815469a76

View File

@ -35,28 +35,24 @@
#include <sys/time.h> #include <sys/time.h>
#include "busybox.h" #include "busybox.h"
#define CT_AUTO 0
#define CT_UNIX2DOS 1 #define CT_UNIX2DOS 1
#define CT_DOS2UNIX 2 #define CT_DOS2UNIX 2
/* We are making a lame pseudo-random string generator here. in /* We are making a lame pseudo-random string generator here. in
* convert(), each pass through the while loop will add more and more * 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 * 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 being accurate. We care about it being messy, since we use it
* it by the sizeof(letters) and then use that as an index into letters
* to pick a random letter to add to out temporary file. */ * to pick a random letter to add to out temporary file. */
typedef unsigned long int bb_uint64_t; 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) static int convert(char *fn, int ConvType)
{ {
int c, fd; int c, fd;
struct timeval tv; struct timeval tv;
char tempFn[BUFSIZ]; RESERVE_CONFIG_BUFFER(tempFn, BUFSIZ);
static bb_uint64_t value=0; static bb_uint64_t value=0;
FILE *in = stdin, *out = stdout; FILE *in, *out;
if (fn != NULL) { if (fn != NULL) {
in = bb_xfopen(fn, "rw"); in = bb_xfopen(fn, "rw");
@ -73,7 +69,9 @@ static int convert(char *fn, int ConvType)
* the input file... */ * the input file... */
gettimeofday (&tv, NULL); gettimeofday (&tv, NULL);
value += ((bb_uint64_t) tv.tv_usec << 16) ^ tv.tv_sec ^ getpid (); 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'; tempFn[c+1] = '\0';
value /= 62; value /= 62;
@ -88,12 +86,16 @@ static int convert(char *fn, int ConvType)
} }
break; break;
} }
} else {
in = stdin;
out = stdout;
} }
while ((c = fgetc(in)) != EOF) { while ((c = fgetc(in)) != EOF) {
if (c == '\r') { if (c == '\r') {
if ((ConvType == CT_UNIX2DOS) && (fn != NULL)) { 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); remove(tempFn);
if (fclose(in) < 0 || fclose(out) < 0) { if (fclose(in) < 0 || fclose(out) < 0) {
bb_perror_nomsg(); bb_perror_nomsg();
@ -101,13 +103,12 @@ static int convert(char *fn, int ConvType)
} }
return 0; return 0;
} }
if (!ConvType)
ConvType = CT_DOS2UNIX;
break; break;
} }
if (c == '\n') { if (c == '\n') {
if ((ConvType == CT_DOS2UNIX) && (fn != NULL)) { 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); remove(tempFn);
if ((fclose(in) < 0) || (fclose(out) < 0)) { if ((fclose(in) < 0) || (fclose(out) < 0)) {
bb_perror_nomsg(); bb_perror_nomsg();
@ -115,27 +116,21 @@ static int convert(char *fn, int ConvType)
} }
return 0; return 0;
} }
if (!ConvType) {
ConvType = CT_UNIX2DOS;
}
if (ConvType == CT_UNIX2DOS) { if (ConvType == CT_UNIX2DOS) {
fputc('\r', out); fputc('\r', out);
} }
fputc('\n', out);
break;
} }
fputc(c, out); fputc(c, out);
} }
if (c != EOF) while (c != EOF && (c = fgetc(in)) != EOF) {
while ((c = fgetc(in)) != EOF) { if (c == '\r')
if (c == '\r') continue;
continue; if (c == '\n') {
if (c == '\n') { if (ConvType == CT_UNIX2DOS)
if (ConvType == CT_UNIX2DOS) fputc('\r', out);
fputc('\r', out); fputc('\n', out);
fputc('\n', out); continue;
continue; }
}
fputc(c, out); fputc(c, out);
} }
@ -160,30 +155,23 @@ static int convert(char *fn, int ConvType)
int dos2unix_main(int argc, char *argv[]) int dos2unix_main(int argc, char *argv[])
{ {
int ConvType = CT_AUTO; int ConvType;
int o; 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') { if (argv[0][0]=='d') {
ConvType = CT_DOS2UNIX; ConvType = CT_DOS2UNIX;
} } else {
if (argv[0][0]=='u') {
ConvType = CT_UNIX2DOS; ConvType = CT_UNIX2DOS;
} }
// process parameters /* process parameters */
while ((o = getopt(argc, argv, "du")) != EOF) { o = bb_getopt_ulflags(argc, argv, "ud");
switch (o) {
case 'd': /* Do the conversion requested by an argument else do the default
ConvType = CT_UNIX2DOS; * conversion depending on our name. */
break; if (o)
case 'u': ConvType = o;
ConvType = CT_DOS2UNIX;
break;
default:
bb_show_usage();
}
}
if (optind < argc) { if (optind < argc) {
while(optind < argc) while(optind < argc)