| 1 | /***************************************************************************** |
| 2 | dos2unix, unix2dos: translate unix <-> dos text files by |
| 3 | -> adding a CR before each LF |
| 4 | <- removing the CR from CRLF pairs |
| 5 | |
| 6 | Use a modern compiler (gcc); name the executable either unix2dos or dos2unix, |
| 7 | and link to the other name. A warning will be printed if the input of unix2dos |
| 8 | contains CR's, as it may have already been a dos file (output still produced). |
| 9 | The warning is not produced if input is stdin. |
| 10 | Jim Martino +++++++++++++++++++++++++++++ |
| 11 | jrm@chow.mat.jhu.edu + PLACE COMMERCIAL HERE + |
| 12 | jmartino@jhunix.hcf.jhu.edu +++++++++++++++++++++++++++++ |
| 13 | Modified by Julian Smart, September 2002 |
| 14 | *****************************************************************************/ |
| 15 | |
| 16 | #include <stdio.h> |
| 17 | #include <stdlib.h> |
| 18 | #include <string.h> |
| 19 | |
| 20 | #define CR '\015' /* define CR character */ |
| 21 | #define LF '\012' /* define LF character */ |
| 22 | |
| 23 | char *prog; /* global var: program name as called */ |
| 24 | int warning=0; /* global var: flag for unix2dos if input has CR's */ |
| 25 | |
| 26 | void usage(); |
| 27 | void translate(FILE *, FILE *, int unix2Dos); |
| 28 | |
| 29 | main(int argc, char *argv[]) |
| 30 | { |
| 31 | FILE *fp, *outFile; |
| 32 | int i; |
| 33 | int unix2Dos; |
| 34 | |
| 35 | prog = argv[0]; /* program name as called */ |
| 36 | |
| 37 | unix2Dos = 1; |
| 38 | |
| 39 | i = 1; |
| 40 | if (argc > 1) |
| 41 | { |
| 42 | if (strcmp(argv[1], "--help") == 0) |
| 43 | { |
| 44 | usage(); |
| 45 | } |
| 46 | else if (strcmp(argv[1], "--dos2unix") == 0) |
| 47 | { |
| 48 | unix2Dos = 0; |
| 49 | } |
| 50 | else if (strcmp(argv[1], "--unix2dos") == 0) |
| 51 | { |
| 52 | unix2Dos = 1; |
| 53 | } |
| 54 | else |
| 55 | { |
| 56 | usage(); |
| 57 | } |
| 58 | } |
| 59 | else |
| 60 | usage(); |
| 61 | |
| 62 | i ++; |
| 63 | if (i == argc) |
| 64 | translate(stdin, stdout, unix2Dos); |
| 65 | else |
| 66 | { |
| 67 | while (i < argc) |
| 68 | { |
| 69 | char tmpFile[512]; |
| 70 | sprintf(tmpFile, "%s.tmp", argv[i]); |
| 71 | |
| 72 | fp = fopen(argv[i], "rb"); |
| 73 | if (!fp) |
| 74 | { |
| 75 | fprintf(stderr, "Cannot open %s.\n", argv[i]); |
| 76 | i ++; |
| 77 | continue; |
| 78 | } |
| 79 | outFile = fopen(tmpFile, "wb"); |
| 80 | if (!outFile) |
| 81 | { |
| 82 | fprintf(stderr, "Cannot open %s.\n", tmpFile); |
| 83 | exit(1); |
| 84 | } |
| 85 | translate(fp, outFile, unix2Dos); |
| 86 | |
| 87 | if (warning) /* unix2dos acting on a possible DOS file */ |
| 88 | { |
| 89 | fprintf(stderr,"%s: %s may have already been in DOS format. Not converted.\n", |
| 90 | prog, argv[i]); |
| 91 | warning = 0; |
| 92 | } |
| 93 | fclose(fp); |
| 94 | fclose(outFile); |
| 95 | #ifdef _WINDOWS |
| 96 | remove(argv[i]); |
| 97 | #else |
| 98 | unlink(argv[i]); |
| 99 | #endif |
| 100 | rename(tmpFile, argv[i]); |
| 101 | |
| 102 | i ++; |
| 103 | } |
| 104 | } |
| 105 | } |
| 106 | |
| 107 | /* translate: unix2dos-change LF to CRLF |
| 108 | dos2unix-strip out CR only before LF */ |
| 109 | |
| 110 | void translate(FILE *ifp, FILE *ofp, int unix2Dos) |
| 111 | { |
| 112 | int c,d; |
| 113 | |
| 114 | if (!unix2Dos) |
| 115 | { |
| 116 | /* DOS2Unix */ |
| 117 | while ((c = getc(ifp)) != EOF) |
| 118 | { |
| 119 | if (c == CR) |
| 120 | { |
| 121 | switch(d = getc(ifp)) |
| 122 | { /* check to see if LF follows */ |
| 123 | case LF: |
| 124 | putc(d,ofp); /* if so, ignore CR */ |
| 125 | break; |
| 126 | default: |
| 127 | putc(c,ofp); /* if not, output CR and following char */ |
| 128 | putc(d,ofp); |
| 129 | } |
| 130 | } |
| 131 | else |
| 132 | putc(c, ofp); /* c is not a CR */ |
| 133 | } |
| 134 | } |
| 135 | else |
| 136 | { |
| 137 | /* Unix2DOS */ |
| 138 | while ((c = getc(ifp)) != EOF){ |
| 139 | if (c == CR) |
| 140 | warning = 1; /* set warning flag: input file may be a DOS file */ |
| 141 | if (c == LF && (warning == 0)) |
| 142 | putc(CR, ofp); /* add CR before each LF */ |
| 143 | putc(c, ofp); |
| 144 | } |
| 145 | } |
| 146 | } |
| 147 | |
| 148 | void usage() |
| 149 | { |
| 150 | fprintf(stderr, "Usage:\n%s [--dos2unix] [--unix2dos] file1 file2 ...\nor\n%s [--dos2unix] [--unix2dos] < infile > outfile\n", prog, prog); |
| 151 | exit(0); |
| 152 | } |