expand: add commented-out code to handle NULs
No binary (build failed)
—
(log yok)
| @@ -64,34 +64,61 @@ enum { | |
| }; | |
| //FIXME: does not work properly with input containing NULs | |
| + | //coreutils 8.30 preserves NULs but treats them as chars of width zero: |
| + | //AB<nul><tab>C will expand <tab> to 6 spaces, not 5. |
| #if ENABLE_EXPAND | |
| static void expand(FILE *file, unsigned tab_size, unsigned opt) | |
| { | |
| - | char *line; |
| - | while ((line = xmalloc_fgets(file)) != NULL) { |
| - | unsigned char c; |
| + | for (;;) { |
| + | char *line; |
| char *ptr; | |
| char *ptr_strbeg; | |
| - | |
| + | //commented-out code handles NULs, +90 bytes of code, not tested much |
| + | // size_t linelen; |
| + | // unsigned len = 0; |
| + | |
| + | // linelen = 1024 * 1024; |
| + | // line = xmalloc_fgets_str_len(file, "\n", &linelen); |
| + | line = xmalloc_fgets(file); // |
| + | if (!line) |
| + | break; |
| ptr = ptr_strbeg = line; | |
| - | while ((c = *ptr) != '\0') { |
| + | for (;;) { |
| + | unsigned char c = *ptr; |
| + | if (c == '\0') { |
| + | // size_t rem = line + linelen - ptr; |
| + | // if (rem > 0) { |
| + | //# if ENABLE_UNICODE_SUPPORT |
| + | // len += unicode_strwidth(ptr_strbeg); |
| + | //# else |
| + | // len += ptr - ptr_strbeg; |
| + | //# endif |
| + | // printf("%s%c", ptr_strbeg, '\0'); |
| + | // memmove(ptr, ptr + 1, rem + 1); |
| + | // ptr_strbeg = ptr; |
| + | // linelen--; |
| + | // continue; |
| + | // } |
| + | break; |
| + | } |
| if ((opt & OPT_INITIAL) && !isblank(c)) { | |
| /* not space or tab */ | |
| break; | |
| } | |
| if (c == '\t') { | |
| - | unsigned len; |
| + | unsigned len = 0; // |
| *ptr = '\0'; | |
| # if ENABLE_UNICODE_SUPPORT | |
| - | len = unicode_strwidth(ptr_strbeg); |
| + | len += unicode_strwidth(ptr_strbeg); |
| # else | |
| - | len = ptr - ptr_strbeg; |
| + | len += ptr - ptr_strbeg; |
| # endif | |
| len = tab_size - (len % tab_size); | |
| /*while (ptr[1] == '\t') { ptr++; len += tab_size; } - can handle many tabs at once */ | |
| printf("%s%*s", ptr_strbeg, len, ""); | |
| + | // len = 0; |
| ptr_strbeg = ptr + 1; | |
| } | |
| ptr++; | |