Skip to content

Commit

Permalink
Function stripspace now gets a buffer instead file descriptors.
Browse files Browse the repository at this point in the history
An implementation easier to call from builtins. It is designed
to be used from the upcoming builtin-tag.c and builtin-commit.c,
because both need to remove unwanted spaces from messages.

Signed-off-by: Carlos Rica <jasampler@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Carlos Rica authored and Junio C Hamano committed Jul 12, 2007
1 parent 73f8936 commit 975e0da
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 25 deletions.
61 changes: 37 additions & 24 deletions builtin-stripspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
#include "cache.h"

/*
* Remove trailing spaces from a line.
* Returns the length of a line, without trailing spaces.
*
* If the line ends with newline, it will be removed too.
* Returns the new length of the string.
*/
static int cleanup(char *line, int len)
static size_t cleanup(char *line, size_t len)
{
if (len) {
if (line[len - 1] == '\n')
Expand All @@ -19,7 +18,6 @@ static int cleanup(char *line, int len)
break;
len--;
}
line[len] = 0;
}
return len;
}
Expand All @@ -28,52 +26,67 @@ static int cleanup(char *line, int len)
* Remove empty lines from the beginning and end
* and also trailing spaces from every line.
*
* Note that the buffer will not be NUL-terminated.
*
* Turn multiple consecutive empty lines between paragraphs
* into just one empty line.
*
* If the input has only empty lines and spaces,
* no output will be produced.
*
* If last line has a newline at the end, it will be removed.
*
* Enable skip_comments to skip every line starting with "#".
*/
void stripspace(FILE *in, FILE *out, int skip_comments)
size_t stripspace(char *buffer, size_t length, int skip_comments)
{
int empties = -1;
int alloc = 1024;
char *line = xmalloc(alloc);
size_t i, j, len, newlen;
char *eol;

while (fgets(line, alloc, in)) {
int len = strlen(line);
for (i = j = 0; i < length; i += len, j += newlen) {
eol = memchr(buffer + i, '\n', length - i);
len = eol ? eol - (buffer + i) + 1 : length - i;

while (len == alloc - 1 && line[len - 1] != '\n') {
alloc = alloc_nr(alloc);
line = xrealloc(line, alloc);
fgets(line + len, alloc - len, in);
len += strlen(line + len);
}

if (skip_comments && line[0] == '#')
if (skip_comments && len && buffer[i] == '#') {
newlen = 0;
continue;
len = cleanup(line, len);
}
newlen = cleanup(buffer + i, len);

/* Not just an empty line? */
if (len) {
if (newlen) {
if (empties != -1)
buffer[j++] = '\n';
if (empties > 0)
fputc('\n', out);
buffer[j++] = '\n';
empties = 0;
fputs(line, out);
fputc('\n', out);
memmove(buffer + j, buffer + i, newlen);
continue;
}
if (empties < 0)
continue;
empties++;
}
free(line);

return j;
}

int cmd_stripspace(int argc, const char **argv, const char *prefix)
{
stripspace(stdin, stdout, 0);
char *buffer;
unsigned long size;

size = 1024;
buffer = xmalloc(size);
if (read_pipe(0, &buffer, &size))
die("could not read the input");

size = stripspace(buffer, size, 0);
write_or_die(1, buffer, size);
if (size)
putc('\n', stdout);

free(buffer);
return 0;
}
2 changes: 1 addition & 1 deletion builtin.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ extern const char git_version_string[];
extern const char git_usage_string[];

extern void help_unknown_cmd(const char *cmd);
extern void stripspace(FILE *in, FILE *out, int skip_comments);
extern size_t stripspace(char *buffer, size_t length, int skip_comments);
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
extern void prune_packed_objects(int);

Expand Down

0 comments on commit 975e0da

Please sign in to comment.