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:
committed by
Junio C Hamano
parent
88e7fdf2cb
commit
ac78e54804
71
convert.c
71
convert.c
@ -79,25 +79,24 @@ static int is_binary(unsigned long size, struct text_stat *stats)
|
||||
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;
|
||||
struct text_stat stats;
|
||||
|
||||
if ((action == CRLF_BINARY) || (action == CRLF_GUESS && !auto_crlf))
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
size = *sizep;
|
||||
if (!size)
|
||||
return 0;
|
||||
buffer = *bufp;
|
||||
return NULL;
|
||||
|
||||
gather_stats(buffer, size, &stats);
|
||||
gather_stats(src, size, &stats);
|
||||
|
||||
/* No CR? Nothing to convert, regardless. */
|
||||
if (!stats.cr)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
if (action == CRLF_GUESS) {
|
||||
/*
|
||||
@ -106,13 +105,13 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
|
||||
* stuff?
|
||||
*/
|
||||
if (stats.cr != stats.crlf)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
* And add some heuristics for binary vs text, of course...
|
||||
*/
|
||||
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.
|
||||
*/
|
||||
nsize = size - stats.crlf;
|
||||
nbuf = xmalloc(nsize);
|
||||
*bufp = nbuf;
|
||||
buffer = xmalloc(nsize);
|
||||
*sizep = nsize;
|
||||
|
||||
dst = buffer;
|
||||
if (action == CRLF_GUESS) {
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
do {
|
||||
unsigned char c = *buffer++;
|
||||
unsigned char c = *src++;
|
||||
if (c != '\r')
|
||||
*nbuf++ = c;
|
||||
*dst++ = c;
|
||||
} while (--size);
|
||||
} else {
|
||||
do {
|
||||
unsigned char c = *buffer++;
|
||||
unsigned char c = *src++;
|
||||
if (! (c == '\r' && (1 < size && *buffer == '\n')))
|
||||
*nbuf++ = c;
|
||||
*dst++ = c;
|
||||
} 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;
|
||||
struct text_stat stats;
|
||||
unsigned char last;
|
||||
|
||||
if ((action == CRLF_BINARY) || (action == CRLF_INPUT) ||
|
||||
(action == CRLF_GUESS && auto_crlf <= 0))
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
size = *sizep;
|
||||
if (!size)
|
||||
return 0;
|
||||
buffer = *bufp;
|
||||
return NULL;
|
||||
|
||||
gather_stats(buffer, size, &stats);
|
||||
gather_stats(src, size, &stats);
|
||||
|
||||
/* No LF? Nothing to convert, regardless. */
|
||||
if (!stats.lf)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
/* Was it already in CRLF format? */
|
||||
if (stats.lf == stats.crlf)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
if (action == CRLF_GUESS) {
|
||||
/* If we have any bare CR characters, we're not going to touch it */
|
||||
if (stats.cr != stats.crlf)
|
||||
return 0;
|
||||
return NULL;
|
||||
|
||||
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.
|
||||
*/
|
||||
nsize = size + stats.lf - stats.crlf;
|
||||
nbuf = xmalloc(nsize);
|
||||
*bufp = nbuf;
|
||||
buffer = xmalloc(nsize);
|
||||
*sizep = nsize;
|
||||
last = 0;
|
||||
|
||||
dst = buffer;
|
||||
do {
|
||||
unsigned char c = *buffer++;
|
||||
unsigned char c = *src++;
|
||||
if (c == '\n' && last != '\r')
|
||||
*nbuf++ = '\r';
|
||||
*nbuf++ = c;
|
||||
*dst++ = '\r';
|
||||
*dst++ = c;
|
||||
last = c;
|
||||
} while (--size);
|
||||
|
||||
return 1;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user