ls: fix help text: -w N is optional
[platform/upstream/busybox.git] / coreutils / dos2unix.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * dos2unix for BusyBox
4  *
5  * dos2unix '\n' convertor 0.5.0
6  * based on Unix2Dos 0.9.0 by Peter Hanecak (made 19.2.1997)
7  * Copyright 1997,.. by Peter Hanecak <hanecak@megaloman.sk>.
8  * All rights reserved.
9  *
10  * dos2unix filters reading input from stdin and writing output to stdout.
11  *
12  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
13 */
14
15 //usage:#define dos2unix_trivial_usage
16 //usage:       "[-ud] [FILE]"
17 //usage:#define dos2unix_full_usage "\n\n"
18 //usage:       "Convert FILE in-place from DOS to Unix format.\n"
19 //usage:       "When no file is given, use stdin/stdout.\n"
20 //usage:     "\nOptions:"
21 //usage:     "\n        -u      dos2unix"
22 //usage:     "\n        -d      unix2dos"
23 //usage:
24 //usage:#define unix2dos_trivial_usage
25 //usage:       "[-ud] [FILE]"
26 //usage:#define unix2dos_full_usage "\n\n"
27 //usage:       "Convert FILE in-place from Unix to DOS format.\n"
28 //usage:       "When no file is given, use stdin/stdout.\n"
29 //usage:     "\nOptions:"
30 //usage:     "\n        -u      dos2unix"
31 //usage:     "\n        -d      unix2dos"
32
33 #include "libbb.h"
34
35 /* This is a NOEXEC applet. Be very careful! */
36
37 enum {
38         CT_UNIX2DOS = 1,
39         CT_DOS2UNIX
40 };
41
42 /* if fn is NULL then input is stdin and output is stdout */
43 static void convert(char *fn, int conv_type)
44 {
45         FILE *in, *out;
46         int i;
47         char *temp_fn = temp_fn; /* for compiler */
48         char *resolved_fn = resolved_fn;
49
50         in = stdin;
51         out = stdout;
52         if (fn != NULL) {
53                 struct stat st;
54
55                 resolved_fn = xmalloc_follow_symlinks(fn);
56                 if (resolved_fn == NULL)
57                         bb_simple_perror_msg_and_die(fn);
58                 in = xfopen_for_read(resolved_fn);
59                 fstat(fileno(in), &st);
60
61                 temp_fn = xasprintf("%sXXXXXX", resolved_fn);
62                 i = xmkstemp(temp_fn);
63                 if (fchmod(i, st.st_mode) == -1)
64                         bb_simple_perror_msg_and_die(temp_fn);
65
66                 out = xfdopen_for_write(i);
67         }
68
69         while ((i = fgetc(in)) != EOF) {
70                 if (i == '\r')
71                         continue;
72                 if (i == '\n')
73                         if (conv_type == CT_UNIX2DOS)
74                                 fputc('\r', out);
75                 fputc(i, out);
76         }
77
78         if (fn != NULL) {
79                 if (fclose(in) < 0 || fclose(out) < 0) {
80                         unlink(temp_fn);
81                         bb_perror_nomsg_and_die();
82                 }
83                 xrename(temp_fn, resolved_fn);
84                 free(temp_fn);
85                 free(resolved_fn);
86         }
87 }
88
89 int dos2unix_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
90 int dos2unix_main(int argc UNUSED_PARAM, char **argv)
91 {
92         int o, conv_type;
93
94         /* See if we are supposed to be doing dos2unix or unix2dos */
95         conv_type = CT_UNIX2DOS;
96         if (applet_name[0] == 'd') {
97                 conv_type = CT_DOS2UNIX;
98         }
99
100         /* -u convert to unix, -d convert to dos */
101         opt_complementary = "u--d:d--u"; /* mutually exclusive */
102         o = getopt32(argv, "du");
103
104         /* Do the conversion requested by an argument else do the default
105          * conversion depending on our name.  */
106         if (o)
107                 conv_type = o;
108
109         argv += optind;
110         do {
111                 /* might be convert(NULL) if there is no filename given */
112                 convert(*argv, conv_type);
113         } while (*argv && *++argv);
114
115         return 0;
116 }