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