Applied patch from Brent Priddy <brent.priddy@adtran.com> to handle the
authorMark Whitley <markw@lineo.com>
Fri, 17 Nov 2000 22:02:45 +0000 (22:02 -0000)
committerMark Whitley <markw@lineo.com>
Fri, 17 Nov 2000 22:02:45 +0000 (22:02 -0000)
special-case of using newlines as field delimiters.

coreutils/cut.c
cut.c

index 1d36a4e888e5d3f0debcd7aa326ada744a1126f6..2d313cc2467fddc6c0567fd7d82b3780d866241e 100644 (file)
@@ -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++;
+                                               }
                                        }
                                }
                        }
diff --git a/cut.c b/cut.c
index 1d36a4e888e5d3f0debcd7aa326ada744a1126f6..2d313cc2467fddc6c0567fd7d82b3780d866241e 100644 (file)
--- a/cut.c
+++ b/cut.c
@@ -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++;
+                                               }
                                        }
                                }
                        }