summaryrefslogtreecommitdiff
path: root/dir.c
diff options
context:
space:
mode:
authorPasha Bolokhov <pasha.bolokhov@gmail.com>2014-06-02 22:36:56 (GMT)
committerJunio C Hamano <gitster@pobox.com>2014-06-02 22:48:48 (GMT)
commite61a6c1d8272f9d7bdc861ed28bfac5fb7e33556 (patch)
tree7da7950f247ea7e7eb8cab7639eb7e4da0c3655e /dir.c
parentbce14aa132e0064d9a9b1c7ad98e71e22c6e0272 (diff)
downloadgit-e61a6c1d8272f9d7bdc861ed28bfac5fb7e33556.zip
git-e61a6c1d8272f9d7bdc861ed28bfac5fb7e33556.tar.gz
git-e61a6c1d8272f9d7bdc861ed28bfac5fb7e33556.tar.bz2
dir.c:trim_trailing_spaces(): fix for " \ " sequence
Discard the unnecessary 'nr_spaces' variable, remove 'strlen()' and improve the 'if' structure. Switch to pointers instead of integers to control the loop. Slightly more rare occurrences of 'text \ ' with a backslash in between spaces are handled correctly. Namely, the code in 7e2e4b37 (dir: ignore trailing spaces in exclude patterns, 2014-02-09) does not reset 'last_space' when a backslash is encountered and the above line stays intact as a result. Add a test at the end of t/t0008-ignores.sh to exhibit this behavior. Signed-off-by: Pasha Bolokhov <pasha.bolokhov@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'dir.c')
-rw-r--r--dir.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/dir.c b/dir.c
index eb6f581..797805d 100644
--- a/dir.c
+++ b/dir.c
@@ -508,21 +508,25 @@ void clear_exclude_list(struct exclude_list *el)
static void trim_trailing_spaces(char *buf)
{
- int i, last_space = -1, nr_spaces, len = strlen(buf);
- for (i = 0; i < len; i++)
- if (buf[i] == '\\')
- i++;
- else if (buf[i] == ' ') {
- if (last_space == -1) {
- last_space = i;
- nr_spaces = 1;
- } else
- nr_spaces++;
- } else
- last_space = -1;
-
- if (last_space != -1 && last_space + nr_spaces == len)
- buf[last_space] = '\0';
+ char *p, *last_space = NULL;
+
+ for (p = buf; *p; p++)
+ switch (*p) {
+ case ' ':
+ if (!last_space)
+ last_space = p;
+ break;
+ case '\\':
+ p++;
+ if (!*p)
+ return;
+ /* fallthrough */
+ default:
+ last_space = NULL;
+ }
+
+ if (last_space)
+ *last_space = '\0';
}
int add_excludes_from_file_to_list(const char *fname,