diff options
Diffstat (limited to 'builtin-stripspace.c')
-rw-r--r-- | builtin-stripspace.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/builtin-stripspace.c b/builtin-stripspace.c new file mode 100644 index 0000000000..2ce1264f7b --- /dev/null +++ b/builtin-stripspace.c @@ -0,0 +1,61 @@ +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include "builtin.h" + +/* + * Remove empty lines from the beginning and end. + * + * Turn multiple consecutive empty lines into just one + * empty line. Return true if it is an incomplete line. + */ +static int cleanup(char *line) +{ + int len = strlen(line); + + if (len && line[len-1] == '\n') { + if (len == 1) + return 0; + do { + unsigned char c = line[len-2]; + if (!isspace(c)) + break; + line[len-2] = '\n'; + len--; + line[len] = 0; + } while (len > 1); + return 0; + } + return 1; +} + +void stripspace(FILE *in, FILE *out) +{ + int empties = -1; + int incomplete = 0; + char line[1024]; + + while (fgets(line, sizeof(line), in)) { + incomplete = cleanup(line); + + /* Not just an empty line? */ + if (line[0] != '\n') { + if (empties > 0) + fputc('\n', out); + empties = 0; + fputs(line, out); + continue; + } + if (empties < 0) + continue; + empties++; + } + if (incomplete) + fputc('\n', out); +} + +int cmd_stripspace(int argc, const char **argv, char **envp) +{ + stripspace(stdin, stdout); + return 0; +} |