pidfile.c: not used anymore
[oweals/busybox.git] / coreutils / cut.c
index 7ba947fae5f664dd928ec6a1f2b4fefddf73ec59..22014fcfb2e229c88e2169196d32292a275a132e 100644 (file)
 
 /* option vars */
 static const char optstring[] = "b:c:f:d:sn";
-
 #define CUT_OPT_BYTE_FLGS      (1<<0)
 #define CUT_OPT_CHAR_FLGS      (1<<1)
 #define CUT_OPT_FIELDS_FLGS    (1<<2)
 #define CUT_OPT_DELIM_FLGS     (1<<3)
 #define CUT_OPT_SUPPRESS_FLGS (1<<4)
-static unsigned opt;
 
 static char delim = '\t';      /* delimiter, default is tab */
 
@@ -52,7 +50,7 @@ static void cut_file(FILE * file)
        unsigned int linenum = 0;       /* keep these zero-based to be consistent */
 
        /* go through every line in the file */
-       while ((line = bb_get_chomped_line_from_file(file)) != NULL) {
+       while ((line = xmalloc_getline(file)) != NULL) {
 
                /* set up a list so we can keep track of what's been printed */
                char * printed = xzalloc(strlen(line) * sizeof(char));
@@ -61,7 +59,7 @@ static void cut_file(FILE * file)
                int spos;
 
                /* cut based on chars/bytes XXX: only works when sizeof(char) == byte */
-               if ((opt & (CUT_OPT_CHAR_FLGS | CUT_OPT_BYTE_FLGS))) {
+               if (option_mask32 & (CUT_OPT_CHAR_FLGS | CUT_OPT_BYTE_FLGS)) {
                        /* print the chars specified in each cut list */
                        for (; cl_pos < nlists; cl_pos++) {
                                spos = cut_lists[cl_pos].startpos;
@@ -115,7 +113,7 @@ static void cut_file(FILE * file)
 
                        /* does this line contain any delimiters? */
                        if (strchr(line, delim) == NULL) {
-                               if (!(opt & CUT_OPT_SUPPRESS_FLGS))
+                               if (!(option_mask32 & CUT_OPT_SUPPRESS_FLGS))
                                        puts(line);
                                goto next_line;
                        }
@@ -125,7 +123,6 @@ static void cut_file(FILE * file)
                        for (; cl_pos < nlists && line; cl_pos++) {
                                spos = cut_lists[cl_pos].startpos;
                                do {
-
                                        /* find the field we're looking for */
                                        while (line && ndelim < spos) {
                                                field = strsep(&line, delimiter);
@@ -156,7 +153,7 @@ static void cut_file(FILE * file)
                /* if we printed anything at all, we need to finish it with a
                 * newline cuz we were handed a chomped line */
                putchar('\n');
        next_line:
+ next_line:
                linenum++;
                free(printed);
                free(orig_line);
@@ -165,19 +162,21 @@ static void cut_file(FILE * file)
 
 static const char _op_on_field[] = " only when operating on fields";
 
+int cut_main(int argc, char **argv);
 int cut_main(int argc, char **argv)
 {
        char *sopt, *ltok;
 
        opt_complementary = "b--bcf:c--bcf:f--bcf";
-       opt = getopt32(argc, argv, optstring, &sopt, &sopt, &sopt, &ltok);
-       if (!(opt & (CUT_OPT_BYTE_FLGS | CUT_OPT_CHAR_FLGS | CUT_OPT_FIELDS_FLGS)))
-               bb_error_msg_and_die
-                       ("expected a list of bytes, characters, or fields");
-       if (opt & BB_GETOPT_ERROR)
+       getopt32(argc, argv, optstring, &sopt, &sopt, &sopt, &ltok);
+//     argc -= optind;
+       argv += optind;
+       if (!(option_mask32 & (CUT_OPT_BYTE_FLGS | CUT_OPT_CHAR_FLGS | CUT_OPT_FIELDS_FLGS)))
+               bb_error_msg_and_die("expected a list of bytes, characters, or fields");
+       if (option_mask32 & BB_GETOPT_ERROR)
                bb_error_msg_and_die("only one type of list may be specified");
 
-       if ((opt & (CUT_OPT_DELIM_FLGS))) {
+       if (option_mask32 & CUT_OPT_DELIM_FLGS) {
                if (strlen(ltok) > 1) {
                        bb_error_msg_and_die("the delimiter must be a single character");
                }
@@ -185,8 +184,8 @@ int cut_main(int argc, char **argv)
        }
 
        /*  non-field (char or byte) cutting has some special handling */
-       if (!(opt & CUT_OPT_FIELDS_FLGS)) {
-               if (opt & CUT_OPT_SUPPRESS_FLGS) {
+       if (!(option_mask32 & CUT_OPT_FIELDS_FLGS)) {
+               if (option_mask32 & CUT_OPT_SUPPRESS_FLGS) {
                        bb_error_msg_and_die
                                ("suppressing non-delimited lines makes sense%s",
                                 _op_on_field);
@@ -251,10 +250,9 @@ int cut_main(int argc, char **argv)
                                bb_error_msg_and_die("invalid byte or field list");
 
                        /* add the new list */
-                       cut_lists =
-                               xrealloc(cut_lists, sizeof(struct cut_list) * (++nlists));
-                       cut_lists[nlists - 1].startpos = s;
-                       cut_lists[nlists - 1].endpos = e;
+                       cut_lists = xrealloc(cut_lists, sizeof(struct cut_list) * (++nlists));
+                       cut_lists[nlists-1].startpos = s;
+                       cut_lists[nlists-1].endpos = e;
                }
 
                /* make sure we got some cut positions out of all that */
@@ -267,22 +265,21 @@ int cut_main(int argc, char **argv)
                qsort(cut_lists, nlists, sizeof(struct cut_list), cmpfunc);
        }
 
-       /* argv[(optind)..(argc-1)] should be names of file to process. If no
+       /* argv[0..argc-1] should be names of file to process. If no
         * files were specified or '-' was specified, take input from stdin.
         * Otherwise, we process all the files specified. */
-       if (argv[optind] == NULL
-               || (argv[optind][0] == '-' && argv[optind][1] == '\0')) {
+       if (argv[0] == NULL || LONE_DASH(argv[0])) {
                cut_file(stdin);
        } else {
                FILE *file;
 
-               for (; optind < argc; optind++) {
-                       file = bb_wfopen(argv[optind], "r");
+               do {
+                       file = fopen_or_warn(argv[0], "r");
                        if (file) {
                                cut_file(file);
                                fclose(file);
                        }
-               }
+               } while (*++argv);
        }
        if (ENABLE_FEATURE_CLEAN_UP)
                free(cut_lists);