xref: /aosp_15_r20/development/tools/line_endings/line_endings.c (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard Worker #include <unistd.h>
2*90c8c64dSAndroid Build Coastguard Worker #include <fcntl.h>
3*90c8c64dSAndroid Build Coastguard Worker #include <stdio.h>
4*90c8c64dSAndroid Build Coastguard Worker #include <string.h>
5*90c8c64dSAndroid Build Coastguard Worker #include <stdlib.h>
6*90c8c64dSAndroid Build Coastguard Worker #include <sys/stat.h>
7*90c8c64dSAndroid Build Coastguard Worker 
8*90c8c64dSAndroid Build Coastguard Worker #define BUFSIZE (1024*8)
9*90c8c64dSAndroid Build Coastguard Worker static void to_unix(char* buf);
10*90c8c64dSAndroid Build Coastguard Worker static void unix_to_dos(char* buf2, const char* buf);
11*90c8c64dSAndroid Build Coastguard Worker 
usage()12*90c8c64dSAndroid Build Coastguard Worker int usage()
13*90c8c64dSAndroid Build Coastguard Worker {
14*90c8c64dSAndroid Build Coastguard Worker     fprintf(stderr, "usage: line_endings unix|dos FILES\n"
15*90c8c64dSAndroid Build Coastguard Worker             "\n"
16*90c8c64dSAndroid Build Coastguard Worker             "Convert FILES to either unix or dos line endings.\n");
17*90c8c64dSAndroid Build Coastguard Worker     return 1;
18*90c8c64dSAndroid Build Coastguard Worker }
19*90c8c64dSAndroid Build Coastguard Worker 
20*90c8c64dSAndroid Build Coastguard Worker typedef struct Node {
21*90c8c64dSAndroid Build Coastguard Worker     struct Node *next;
22*90c8c64dSAndroid Build Coastguard Worker     char buf[BUFSIZE*2+3];
23*90c8c64dSAndroid Build Coastguard Worker } Node;
24*90c8c64dSAndroid Build Coastguard Worker 
25*90c8c64dSAndroid Build Coastguard Worker int
main(int argc,char ** argv)26*90c8c64dSAndroid Build Coastguard Worker main(int argc, char** argv)
27*90c8c64dSAndroid Build Coastguard Worker {
28*90c8c64dSAndroid Build Coastguard Worker     enum { UNIX, DOS } ending;
29*90c8c64dSAndroid Build Coastguard Worker     int i;
30*90c8c64dSAndroid Build Coastguard Worker 
31*90c8c64dSAndroid Build Coastguard Worker     if (argc < 2) {
32*90c8c64dSAndroid Build Coastguard Worker         return usage();
33*90c8c64dSAndroid Build Coastguard Worker     }
34*90c8c64dSAndroid Build Coastguard Worker 
35*90c8c64dSAndroid Build Coastguard Worker     if (0 == strcmp("unix", argv[1])) {
36*90c8c64dSAndroid Build Coastguard Worker         ending = UNIX;
37*90c8c64dSAndroid Build Coastguard Worker     }
38*90c8c64dSAndroid Build Coastguard Worker     else if (0 == strcmp("dos", argv[1])) {
39*90c8c64dSAndroid Build Coastguard Worker         ending = DOS;
40*90c8c64dSAndroid Build Coastguard Worker     }
41*90c8c64dSAndroid Build Coastguard Worker     else {
42*90c8c64dSAndroid Build Coastguard Worker         return usage();
43*90c8c64dSAndroid Build Coastguard Worker     }
44*90c8c64dSAndroid Build Coastguard Worker 
45*90c8c64dSAndroid Build Coastguard Worker     for (i=2; i<argc; i++) {
46*90c8c64dSAndroid Build Coastguard Worker         int fd;
47*90c8c64dSAndroid Build Coastguard Worker         int len;
48*90c8c64dSAndroid Build Coastguard Worker 
49*90c8c64dSAndroid Build Coastguard Worker         // force implied
50*90c8c64dSAndroid Build Coastguard Worker         chmod(argv[i], S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
51*90c8c64dSAndroid Build Coastguard Worker 
52*90c8c64dSAndroid Build Coastguard Worker         fd = open(argv[i], O_RDWR);
53*90c8c64dSAndroid Build Coastguard Worker         if (fd < 0) {
54*90c8c64dSAndroid Build Coastguard Worker             fprintf(stderr, "unable to open file for read/write: %s\n", argv[i]);
55*90c8c64dSAndroid Build Coastguard Worker             return 1;
56*90c8c64dSAndroid Build Coastguard Worker         }
57*90c8c64dSAndroid Build Coastguard Worker 
58*90c8c64dSAndroid Build Coastguard Worker         len = lseek(fd, 0, SEEK_END);
59*90c8c64dSAndroid Build Coastguard Worker         lseek(fd, 0, SEEK_SET);
60*90c8c64dSAndroid Build Coastguard Worker 
61*90c8c64dSAndroid Build Coastguard Worker         if (len > 0) {
62*90c8c64dSAndroid Build Coastguard Worker             Node* root = malloc(sizeof(Node));
63*90c8c64dSAndroid Build Coastguard Worker             Node* node = root;
64*90c8c64dSAndroid Build Coastguard Worker             node->buf[0] = 0;
65*90c8c64dSAndroid Build Coastguard Worker 
66*90c8c64dSAndroid Build Coastguard Worker             while (len > 0) {
67*90c8c64dSAndroid Build Coastguard Worker                 node->next = malloc(sizeof(Node));
68*90c8c64dSAndroid Build Coastguard Worker                 node = node->next;
69*90c8c64dSAndroid Build Coastguard Worker                 node->next = NULL;
70*90c8c64dSAndroid Build Coastguard Worker 
71*90c8c64dSAndroid Build Coastguard Worker                 char buf[BUFSIZE+2];
72*90c8c64dSAndroid Build Coastguard Worker                 ssize_t amt;
73*90c8c64dSAndroid Build Coastguard Worker                 ssize_t amt2 = len < BUFSIZE ? len : BUFSIZE;
74*90c8c64dSAndroid Build Coastguard Worker                 amt = read(fd, buf, amt2);
75*90c8c64dSAndroid Build Coastguard Worker                 if (amt != amt2) {
76*90c8c64dSAndroid Build Coastguard Worker                     fprintf(stderr, "unable to read file: %s\n", argv[i]);
77*90c8c64dSAndroid Build Coastguard Worker                     return 1;
78*90c8c64dSAndroid Build Coastguard Worker                 }
79*90c8c64dSAndroid Build Coastguard Worker                 buf[amt2] = '\0';
80*90c8c64dSAndroid Build Coastguard Worker                 to_unix(buf);
81*90c8c64dSAndroid Build Coastguard Worker                 if (ending == UNIX) {
82*90c8c64dSAndroid Build Coastguard Worker                     strcpy(node->buf, buf);
83*90c8c64dSAndroid Build Coastguard Worker                 } else {
84*90c8c64dSAndroid Build Coastguard Worker                     char buf2[(BUFSIZE*2)+3];
85*90c8c64dSAndroid Build Coastguard Worker                     unix_to_dos(buf2, buf);
86*90c8c64dSAndroid Build Coastguard Worker                     strcpy(node->buf, buf2);
87*90c8c64dSAndroid Build Coastguard Worker                 }
88*90c8c64dSAndroid Build Coastguard Worker                 len -= amt2;
89*90c8c64dSAndroid Build Coastguard Worker             }
90*90c8c64dSAndroid Build Coastguard Worker 
91*90c8c64dSAndroid Build Coastguard Worker             (void)ftruncate(fd, 0);
92*90c8c64dSAndroid Build Coastguard Worker             lseek(fd, 0, SEEK_SET);
93*90c8c64dSAndroid Build Coastguard Worker             while (root) {
94*90c8c64dSAndroid Build Coastguard Worker                 ssize_t amt2 = strlen(root->buf);
95*90c8c64dSAndroid Build Coastguard Worker                 if (amt2 > 0) {
96*90c8c64dSAndroid Build Coastguard Worker                     ssize_t amt = write(fd, root->buf, amt2);
97*90c8c64dSAndroid Build Coastguard Worker                     if (amt != amt2) {
98*90c8c64dSAndroid Build Coastguard Worker                         fprintf(stderr, "unable to write file: %s\n", argv[i]);
99*90c8c64dSAndroid Build Coastguard Worker                         return 1;
100*90c8c64dSAndroid Build Coastguard Worker                     }
101*90c8c64dSAndroid Build Coastguard Worker                 }
102*90c8c64dSAndroid Build Coastguard Worker                 node = root;
103*90c8c64dSAndroid Build Coastguard Worker                 root = root->next;
104*90c8c64dSAndroid Build Coastguard Worker                 free(node);
105*90c8c64dSAndroid Build Coastguard Worker             }
106*90c8c64dSAndroid Build Coastguard Worker         }
107*90c8c64dSAndroid Build Coastguard Worker         close(fd);
108*90c8c64dSAndroid Build Coastguard Worker     }
109*90c8c64dSAndroid Build Coastguard Worker     return 0;
110*90c8c64dSAndroid Build Coastguard Worker }
111*90c8c64dSAndroid Build Coastguard Worker 
112*90c8c64dSAndroid Build Coastguard Worker void
to_unix(char * buf)113*90c8c64dSAndroid Build Coastguard Worker to_unix(char* buf)
114*90c8c64dSAndroid Build Coastguard Worker {
115*90c8c64dSAndroid Build Coastguard Worker     char* p = buf;
116*90c8c64dSAndroid Build Coastguard Worker     char* q = buf;
117*90c8c64dSAndroid Build Coastguard Worker     while (*p) {
118*90c8c64dSAndroid Build Coastguard Worker         if (p[0] == '\r' && p[1] == '\n') {
119*90c8c64dSAndroid Build Coastguard Worker             // dos
120*90c8c64dSAndroid Build Coastguard Worker             *q = '\n';
121*90c8c64dSAndroid Build Coastguard Worker             p += 2;
122*90c8c64dSAndroid Build Coastguard Worker             q += 1;
123*90c8c64dSAndroid Build Coastguard Worker         }
124*90c8c64dSAndroid Build Coastguard Worker         else if (p[0] == '\r') {
125*90c8c64dSAndroid Build Coastguard Worker             // old mac
126*90c8c64dSAndroid Build Coastguard Worker             *q = '\n';
127*90c8c64dSAndroid Build Coastguard Worker             p += 1;
128*90c8c64dSAndroid Build Coastguard Worker             q += 1;
129*90c8c64dSAndroid Build Coastguard Worker         }
130*90c8c64dSAndroid Build Coastguard Worker         else {
131*90c8c64dSAndroid Build Coastguard Worker             *q = *p;
132*90c8c64dSAndroid Build Coastguard Worker             p += 1;
133*90c8c64dSAndroid Build Coastguard Worker             q += 1;
134*90c8c64dSAndroid Build Coastguard Worker         }
135*90c8c64dSAndroid Build Coastguard Worker     }
136*90c8c64dSAndroid Build Coastguard Worker     *q = '\0';
137*90c8c64dSAndroid Build Coastguard Worker }
138*90c8c64dSAndroid Build Coastguard Worker 
139*90c8c64dSAndroid Build Coastguard Worker void
unix_to_dos(char * buf2,const char * buf)140*90c8c64dSAndroid Build Coastguard Worker unix_to_dos(char* buf2, const char* buf)
141*90c8c64dSAndroid Build Coastguard Worker {
142*90c8c64dSAndroid Build Coastguard Worker     const char* p = buf;
143*90c8c64dSAndroid Build Coastguard Worker     char* q = buf2;
144*90c8c64dSAndroid Build Coastguard Worker     while (*p) {
145*90c8c64dSAndroid Build Coastguard Worker         if (*p == '\n') {
146*90c8c64dSAndroid Build Coastguard Worker             q[0] = '\r';
147*90c8c64dSAndroid Build Coastguard Worker             q[1] = '\n';
148*90c8c64dSAndroid Build Coastguard Worker             q += 2;
149*90c8c64dSAndroid Build Coastguard Worker             p += 1;
150*90c8c64dSAndroid Build Coastguard Worker         } else {
151*90c8c64dSAndroid Build Coastguard Worker             *q = *p;
152*90c8c64dSAndroid Build Coastguard Worker             p += 1;
153*90c8c64dSAndroid Build Coastguard Worker             q += 1;
154*90c8c64dSAndroid Build Coastguard Worker         }
155*90c8c64dSAndroid Build Coastguard Worker     }
156*90c8c64dSAndroid Build Coastguard Worker     *q = '\0';
157*90c8c64dSAndroid Build Coastguard Worker }
158*90c8c64dSAndroid Build Coastguard Worker 
159