xref: /aosp_15_r20/external/toybox/toys/other/dos2unix.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* dos2unix.c - convert newline format
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2012 Rob Landley <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker 
5*cf5a6c84SAndroid Build Coastguard Worker USE_DOS2UNIX(NEWTOY(dos2unix, 0, TOYFLAG_BIN))
6*cf5a6c84SAndroid Build Coastguard Worker USE_UNIX2DOS(NEWTOY(unix2dos, 0, TOYFLAG_BIN))
7*cf5a6c84SAndroid Build Coastguard Worker 
8*cf5a6c84SAndroid Build Coastguard Worker config DOS2UNIX
9*cf5a6c84SAndroid Build Coastguard Worker   bool "dos2unix/unix2dos"
10*cf5a6c84SAndroid Build Coastguard Worker   default y
11*cf5a6c84SAndroid Build Coastguard Worker   help
12*cf5a6c84SAndroid Build Coastguard Worker     usage: dos2unix [FILE...]
13*cf5a6c84SAndroid Build Coastguard Worker 
14*cf5a6c84SAndroid Build Coastguard Worker     Convert newline format from dos "\r\n" to unix "\n".
15*cf5a6c84SAndroid Build Coastguard Worker     If no files listed copy from stdin, "-" is a synonym for stdin.
16*cf5a6c84SAndroid Build Coastguard Worker 
17*cf5a6c84SAndroid Build Coastguard Worker config UNIX2DOS
18*cf5a6c84SAndroid Build Coastguard Worker   bool "unix2dos"
19*cf5a6c84SAndroid Build Coastguard Worker   default y
20*cf5a6c84SAndroid Build Coastguard Worker   help
21*cf5a6c84SAndroid Build Coastguard Worker     usage: unix2dos [FILE...]
22*cf5a6c84SAndroid Build Coastguard Worker 
23*cf5a6c84SAndroid Build Coastguard Worker     Convert newline format from unix "\n" to dos "\r\n".
24*cf5a6c84SAndroid Build Coastguard Worker     If no files listed copy from stdin, "-" is a synonym for stdin.
25*cf5a6c84SAndroid Build Coastguard Worker */
26*cf5a6c84SAndroid Build Coastguard Worker 
27*cf5a6c84SAndroid Build Coastguard Worker #define FOR_dos2unix
28*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
29*cf5a6c84SAndroid Build Coastguard Worker 
GLOBALS(char * tempfile;)30*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
31*cf5a6c84SAndroid Build Coastguard Worker   char *tempfile;
32*cf5a6c84SAndroid Build Coastguard Worker )
33*cf5a6c84SAndroid Build Coastguard Worker 
34*cf5a6c84SAndroid Build Coastguard Worker static void do_dos2unix(int fd, char *name)
35*cf5a6c84SAndroid Build Coastguard Worker {
36*cf5a6c84SAndroid Build Coastguard Worker   char c = toys.which->name[0];
37*cf5a6c84SAndroid Build Coastguard Worker   int outfd = 1, catch = 0;
38*cf5a6c84SAndroid Build Coastguard Worker 
39*cf5a6c84SAndroid Build Coastguard Worker   if (fd) outfd = copy_tempfile(fd, name, &TT.tempfile);
40*cf5a6c84SAndroid Build Coastguard Worker 
41*cf5a6c84SAndroid Build Coastguard Worker   for (;;) {
42*cf5a6c84SAndroid Build Coastguard Worker     int len, in, out;
43*cf5a6c84SAndroid Build Coastguard Worker 
44*cf5a6c84SAndroid Build Coastguard Worker     len = read(fd, toybuf+(sizeof(toybuf)/2), sizeof(toybuf)/2);
45*cf5a6c84SAndroid Build Coastguard Worker     if (len<0) perror_msg_raw(name);
46*cf5a6c84SAndroid Build Coastguard Worker     if (len<1) break;
47*cf5a6c84SAndroid Build Coastguard Worker 
48*cf5a6c84SAndroid Build Coastguard Worker     for (in = out = 0; in < len; in++) {
49*cf5a6c84SAndroid Build Coastguard Worker       char x = toybuf[in+sizeof(toybuf)/2];
50*cf5a6c84SAndroid Build Coastguard Worker 
51*cf5a6c84SAndroid Build Coastguard Worker       // Drop \r only if followed by \n in dos2unix mode
52*cf5a6c84SAndroid Build Coastguard Worker       if (catch) {
53*cf5a6c84SAndroid Build Coastguard Worker         if (c == 'u' || x != '\n') toybuf[out++] = '\r';
54*cf5a6c84SAndroid Build Coastguard Worker         catch = 0;
55*cf5a6c84SAndroid Build Coastguard Worker       // Add \r only if \n not after \r in unix2dos mode
56*cf5a6c84SAndroid Build Coastguard Worker       } else if (c == 'u' && x == '\n') toybuf[out++] = '\r';
57*cf5a6c84SAndroid Build Coastguard Worker 
58*cf5a6c84SAndroid Build Coastguard Worker       if (x == '\r') catch++;
59*cf5a6c84SAndroid Build Coastguard Worker       else toybuf[out++] = x;
60*cf5a6c84SAndroid Build Coastguard Worker     }
61*cf5a6c84SAndroid Build Coastguard Worker     xwrite(outfd, toybuf, out);
62*cf5a6c84SAndroid Build Coastguard Worker   }
63*cf5a6c84SAndroid Build Coastguard Worker   if (catch) xwrite(outfd, "\r", 1);
64*cf5a6c84SAndroid Build Coastguard Worker 
65*cf5a6c84SAndroid Build Coastguard Worker   if (fd) replace_tempfile(-1, outfd, &TT.tempfile);
66*cf5a6c84SAndroid Build Coastguard Worker }
67*cf5a6c84SAndroid Build Coastguard Worker 
dos2unix_main(void)68*cf5a6c84SAndroid Build Coastguard Worker void dos2unix_main(void)
69*cf5a6c84SAndroid Build Coastguard Worker {
70*cf5a6c84SAndroid Build Coastguard Worker   loopfiles(toys.optargs, do_dos2unix);
71*cf5a6c84SAndroid Build Coastguard Worker }
72*cf5a6c84SAndroid Build Coastguard Worker 
unix2dos_main(void)73*cf5a6c84SAndroid Build Coastguard Worker void unix2dos_main(void)
74*cf5a6c84SAndroid Build Coastguard Worker {
75*cf5a6c84SAndroid Build Coastguard Worker   dos2unix_main();
76*cf5a6c84SAndroid Build Coastguard Worker }
77