diff options
author | Lukas Sandström <lukass@etek.chalmers.se> | 2006-06-13 22:21:53 +0200 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-06-18 22:12:16 -0700 |
commit | 7499c996156ea99702fe13e203b97ae60d8868ad (patch) | |
tree | b7b611873ea14e652cd9e2443636d34f13a06289 /builtin-stripspace.c | |
parent | 34488e3c375d159506d5d98e012f3b36e7cd9fe7 (diff) | |
download | git-7499c996156ea99702fe13e203b97ae60d8868ad.tar.gz |
Make git-stripspace a builtin
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
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; +} |