X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=cut.c;h=7e9a72e3f7ba67eeef659bf544b5afe6f624f4a8;hb=a8035a51be6ddaf636847cfb1524b1beed0e8d18;hp=fec52d3d4a4379da72c9764a84e9e3b0f2c3217e;hpb=5ae166813f8a6db9784e75c9b3843e1e30a7465f;p=oweals%2Fbusybox.git diff --git a/cut.c b/cut.c index fec52d3d4..7e9a72e3f 100644 --- a/cut.c +++ b/cut.c @@ -1,8 +1,8 @@ /* * cut.c - minimalist version of cut * - * Copyright (C) 1999,2000 by Lineo, inc. - * Written by Mark Whitley , + * Copyright (C) 1999,2000,2001 by Lineo, inc. + * Written by Mark Whitley , * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,7 +26,7 @@ #include #include #include -#include "internal.h" +#include "busybox.h" /* globals from other files */ @@ -54,12 +54,12 @@ static void decompose_list(const char *list) /* the list must contain only digits and no more than one minus sign */ for (ptr = (char *)list; *ptr; ptr++) { if (!isdigit(*ptr) && *ptr != '-') { - fatalError("invalid byte or field list\n"); + error_msg_and_die("invalid byte or field list"); } if (*ptr == '-') { nminus++; if (nminus > 1) { - fatalError("invalid byte or field list\n"); + error_msg_and_die("invalid byte or field list"); } } } @@ -68,7 +68,7 @@ static void decompose_list(const char *list) if (nminus == 0) { startpos = strtol(list, &ptr, 10); if (startpos == 0) { - fatalError("missing list of fields\n"); + error_msg_and_die("missing list of fields"); } endpos = startpos; } @@ -102,10 +102,10 @@ static void decompose_list(const char *list) static void cut_file(FILE *file) { char *line; + unsigned int cr_hits = 0; /* go through every line in the file */ for (line = NULL; (line = get_line_from_file(file)) != NULL; free(line)) { - /* cut based on chars/bytes */ if (part == 'c' || part == 'b') { int i; @@ -129,34 +129,47 @@ static void cut_file(FILE *file) char *start = line; unsigned int delims_hit = 0; - for (ptr = line; (ptr = strchr(ptr, delim)) != NULL; ptr++) { - delims_hit++; - if (delims_hit == (startpos - 1)) { - start = ptr+1; - } - if (delims_hit == endpos) { - break; - } - } - /* we didn't hit any delimeters */ - if (delims_hit == 0 && !supress_non_delimited_lines) { - fputs(line, stdout); - } - /* we =did= hit some delimiters */ - else if (delims_hit > 0) { - /* we have a fixed end point */ - if (ptr) { - while (start < ptr) { + if (delim == '\n') { + cr_hits++; + if (cr_hits >= startpos && cr_hits <= endpos) { + while (*start && *start != '\n') { fputc(*start, stdout); start++; } fputc('\n', stdout); } - /* or we're just going til the end of the line */ - else { - while (*start) { - fputc(*start, stdout); - start++; + } + else { + for (ptr = line; (ptr = strchr(ptr, delim)) != NULL; ptr++) { + delims_hit++; + if (delims_hit == (startpos - 1)) { + start = ptr+1; + } + if (delims_hit == endpos) { + break; + } + } + + /* we didn't hit any delimeters */ + if (delims_hit == 0 && !supress_non_delimited_lines) { + fputs(line, stdout); + } + /* we =did= hit some delimiters */ + else if (delims_hit > 0) { + /* we have a fixed end point */ + if (ptr) { + while (start < ptr) { + fputc(*start, stdout); + start++; + } + fputc('\n', stdout); + } + /* or we're just going til the end of the line */ + else { + while (*start) { + fputc(*start, stdout); + start++; + } } } } @@ -175,14 +188,14 @@ extern int cut_main(int argc, char **argv) case 'f': /* make sure they didn't ask for two types of lists */ if (part != 0) { - fatalError("only one type of list may be specified"); + error_msg_and_die("only one type of list may be specified"); } part = (char)opt; decompose_list(optarg); break; case 'd': if (strlen(optarg) > 1) { - fatalError("the delimiter must be a single character\n"); + error_msg_and_die("the delimiter must be a single character"); } delim = optarg[0]; break; @@ -196,16 +209,17 @@ extern int cut_main(int argc, char **argv) } if (part == 0) { - fatalError("you must specify a list of bytes, characters, or fields\n"); + error_msg_and_die("you must specify a list of bytes, characters, or fields"); } if (supress_non_delimited_lines && part != 'f') { - fatalError("suppressing non-delimited lines makes sense - only when operating on fields\n"); + error_msg_and_die("suppressing non-delimited lines makes sense" + " only when operating on fields"); + } if (delim != '\t' && part != 'f') { - fatalError("a delimiter may be specified only when operating on fields\n"); + error_msg_and_die("a delimiter may be specified only when operating on fields"); } /* argv[(optind)..(argc-1)] should be names of file to process. If no @@ -220,7 +234,7 @@ extern int cut_main(int argc, char **argv) for (i = optind; i < argc; i++) { file = fopen(argv[i], "r"); if (file == NULL) { - errorMsg("%s: %s\n", argv[i], strerror(errno)); + perror_msg("%s", argv[i]); } else { cut_file(file); fclose(file); @@ -228,5 +242,5 @@ extern int cut_main(int argc, char **argv) } } - return 0; + return EXIT_SUCCESS; }