Simplify calling of CR/LF conversion routines

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Alex Riesen 2007-04-19 02:05:03 +02:00 коммит произвёл Junio C Hamano
Родитель 88e7fdf2cb
Коммит ac78e54804
6 изменённых файлов: 51 добавлений и 60 удалений

Просмотреть файл

@ -1475,8 +1475,8 @@ static int read_old_data(struct stat *st, const char *path, char **buf_p, unsign
} }
close(fd); close(fd);
nsize = got; nsize = got;
nbuf = buf; nbuf = convert_to_git(path, buf, &nsize);
if (convert_to_git(path, &nbuf, &nsize)) { if (nbuf) {
free(buf); free(buf);
*buf_p = nbuf; *buf_p = nbuf;
*alloc_p = nsize; *alloc_p = nsize;
@ -2355,9 +2355,8 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size) static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
{ {
int fd, converted; int fd;
char *nbuf; char *nbuf;
unsigned long nsize;
if (has_symlinks && S_ISLNK(mode)) if (has_symlinks && S_ISLNK(mode))
/* Although buf:size is counted string, it also is NUL /* Although buf:size is counted string, it also is NUL
@ -2369,13 +2368,10 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
if (fd < 0) if (fd < 0)
return -1; return -1;
nsize = size; nbuf = convert_to_working_tree(path, buf, &size);
nbuf = (char *) buf; if (nbuf)
converted = convert_to_working_tree(path, &nbuf, &nsize);
if (converted) {
buf = nbuf; buf = nbuf;
size = nsize;
}
while (size) { while (size) {
int written = xwrite(fd, buf, size); int written = xwrite(fd, buf, size);
if (written < 0) if (written < 0)
@ -2387,7 +2383,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
} }
if (close(fd) < 0) if (close(fd) < 0)
die("closing file %s: %s", path, strerror(errno)); die("closing file %s: %s", path, strerror(errno));
if (converted) if (nbuf)
free(nbuf); free(nbuf);
return 0; return 0;
} }

Просмотреть файл

@ -496,8 +496,8 @@ extern void trace_printf(const char *format, ...);
extern void trace_argv_printf(const char **argv, int count, const char *format, ...); extern void trace_argv_printf(const char **argv, int count, const char *format, ...);
/* convert.c */ /* convert.c */
extern int convert_to_git(const char *path, char **bufp, unsigned long *sizep); extern char *convert_to_git(const char *path, const char *src, unsigned long *sizep);
extern int convert_to_working_tree(const char *path, char **bufp, unsigned long *sizep); extern char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep);
/* match-trees.c */ /* match-trees.c */
void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int); void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int);

Просмотреть файл

@ -79,25 +79,24 @@ static int is_binary(unsigned long size, struct text_stat *stats)
return 0; return 0;
} }
static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int action) static char *crlf_to_git(const char *path, const char *src, unsigned long *sizep, int action)
{ {
char *buffer, *nbuf; char *buffer, *dst;
unsigned long size, nsize; unsigned long size, nsize;
struct text_stat stats; struct text_stat stats;
if ((action == CRLF_BINARY) || (action == CRLF_GUESS && !auto_crlf)) if ((action == CRLF_BINARY) || (action == CRLF_GUESS && !auto_crlf))
return 0; return NULL;
size = *sizep; size = *sizep;
if (!size) if (!size)
return 0; return NULL;
buffer = *bufp;
gather_stats(buffer, size, &stats); gather_stats(src, size, &stats);
/* No CR? Nothing to convert, regardless. */ /* No CR? Nothing to convert, regardless. */
if (!stats.cr) if (!stats.cr)
return 0; return NULL;
if (action == CRLF_GUESS) { if (action == CRLF_GUESS) {
/* /*
@ -106,13 +105,13 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
* stuff? * stuff?
*/ */
if (stats.cr != stats.crlf) if (stats.cr != stats.crlf)
return 0; return NULL;
/* /*
* And add some heuristics for binary vs text, of course... * And add some heuristics for binary vs text, of course...
*/ */
if (is_binary(size, &stats)) if (is_binary(size, &stats))
return 0; return NULL;
} }
/* /*
@ -120,10 +119,10 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
* to let the caller know that we switched buffers on it. * to let the caller know that we switched buffers on it.
*/ */
nsize = size - stats.crlf; nsize = size - stats.crlf;
nbuf = xmalloc(nsize); buffer = xmalloc(nsize);
*bufp = nbuf;
*sizep = nsize; *sizep = nsize;
dst = buffer;
if (action == CRLF_GUESS) { if (action == CRLF_GUESS) {
/* /*
* If we guessed, we already know we rejected a file with * If we guessed, we already know we rejected a file with
@ -131,54 +130,53 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
* follow it. * follow it.
*/ */
do { do {
unsigned char c = *buffer++; unsigned char c = *src++;
if (c != '\r') if (c != '\r')
*nbuf++ = c; *dst++ = c;
} while (--size); } while (--size);
} else { } else {
do { do {
unsigned char c = *buffer++; unsigned char c = *src++;
if (! (c == '\r' && (1 < size && *buffer == '\n'))) if (! (c == '\r' && (1 < size && *buffer == '\n')))
*nbuf++ = c; *dst++ = c;
} while (--size); } while (--size);
} }
return 1; return buffer;
} }
static int crlf_to_worktree(const char *path, char **bufp, unsigned long *sizep, int action) static char *crlf_to_worktree(const char *path, const char *src, unsigned long *sizep, int action)
{ {
char *buffer, *nbuf; char *buffer, *dst;
unsigned long size, nsize; unsigned long size, nsize;
struct text_stat stats; struct text_stat stats;
unsigned char last; unsigned char last;
if ((action == CRLF_BINARY) || (action == CRLF_INPUT) || if ((action == CRLF_BINARY) || (action == CRLF_INPUT) ||
(action == CRLF_GUESS && auto_crlf <= 0)) (action == CRLF_GUESS && auto_crlf <= 0))
return 0; return NULL;
size = *sizep; size = *sizep;
if (!size) if (!size)
return 0; return NULL;
buffer = *bufp;
gather_stats(buffer, size, &stats); gather_stats(src, size, &stats);
/* No LF? Nothing to convert, regardless. */ /* No LF? Nothing to convert, regardless. */
if (!stats.lf) if (!stats.lf)
return 0; return NULL;
/* Was it already in CRLF format? */ /* Was it already in CRLF format? */
if (stats.lf == stats.crlf) if (stats.lf == stats.crlf)
return 0; return NULL;
if (action == CRLF_GUESS) { if (action == CRLF_GUESS) {
/* If we have any bare CR characters, we're not going to touch it */ /* If we have any bare CR characters, we're not going to touch it */
if (stats.cr != stats.crlf) if (stats.cr != stats.crlf)
return 0; return NULL;
if (is_binary(size, &stats)) if (is_binary(size, &stats))
return 0; return NULL;
} }
/* /*
@ -186,19 +184,20 @@ static int crlf_to_worktree(const char *path, char **bufp, unsigned long *sizep,
* to let the caller know that we switched buffers on it. * to let the caller know that we switched buffers on it.
*/ */
nsize = size + stats.lf - stats.crlf; nsize = size + stats.lf - stats.crlf;
nbuf = xmalloc(nsize); buffer = xmalloc(nsize);
*bufp = nbuf;
*sizep = nsize; *sizep = nsize;
last = 0; last = 0;
dst = buffer;
do { do {
unsigned char c = *buffer++; unsigned char c = *src++;
if (c == '\n' && last != '\r') if (c == '\n' && last != '\r')
*nbuf++ = '\r'; *dst++ = '\r';
*nbuf++ = c; *dst++ = c;
last = c; last = c;
} while (--size); } while (--size);
return 1; return buffer;
} }
static void setup_crlf_check(struct git_attr_check *check) static void setup_crlf_check(struct git_attr_check *check)
@ -231,12 +230,12 @@ static int git_path_check_crlf(const char *path)
return CRLF_GUESS; return CRLF_GUESS;
} }
int convert_to_git(const char *path, char **bufp, unsigned long *sizep) char *convert_to_git(const char *path, const char *src, unsigned long *sizep)
{ {
return crlf_to_git(path, bufp, sizep, git_path_check_crlf(path)); return crlf_to_git(path, src, sizep, git_path_check_crlf(path));
} }
int convert_to_working_tree(const char *path, char **bufp, unsigned long *sizep) char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep)
{ {
return crlf_to_worktree(path, bufp, sizep, git_path_check_crlf(path)); return crlf_to_worktree(path, src, sizep, git_path_check_crlf(path));
} }

4
diff.c
Просмотреть файл

@ -1493,9 +1493,9 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
/* /*
* Convert from working tree format to canonical git format * Convert from working tree format to canonical git format
*/ */
buf = s->data;
size = s->size; size = s->size;
if (convert_to_git(s->path, &buf, &size)) { buf = convert_to_git(s->path, s->data, &size);
if (buf) {
munmap(s->data, s->size); munmap(s->data, s->size);
s->should_munmap = 0; s->should_munmap = 0;
s->data = buf; s->data = buf;

Просмотреть файл

@ -79,7 +79,6 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
} }
switch (ntohl(ce->ce_mode) & S_IFMT) { switch (ntohl(ce->ce_mode) & S_IFMT) {
char *buf; char *buf;
unsigned long nsize;
case S_IFREG: case S_IFREG:
if (to_tempfile) { if (to_tempfile) {
@ -96,12 +95,10 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
/* /*
* Convert from git internal format to working tree format * Convert from git internal format to working tree format
*/ */
buf = new; buf = convert_to_working_tree(ce->name, new, &size);
nsize = size; if (buf) {
if (convert_to_working_tree(ce->name, &buf, &nsize)) {
free(new); free(new);
new = buf; new = buf;
size = nsize;
} }
wrote = write_in_full(fd, new, size); wrote = write_in_full(fd, new, size);

Просмотреть файл

@ -2277,10 +2277,9 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
*/ */
if ((type == OBJ_BLOB) && S_ISREG(st->st_mode)) { if ((type == OBJ_BLOB) && S_ISREG(st->st_mode)) {
unsigned long nsize = size; unsigned long nsize = size;
char *nbuf = buf; char *nbuf = convert_to_git(path, buf, &nsize);
if (convert_to_git(path, &nbuf, &nsize)) { if (nbuf) {
if (size) munmap(buf, size);
munmap(buf, size);
size = nsize; size = nsize;
buf = nbuf; buf = nbuf;
re_allocated = 1; re_allocated = 1;