]> git.ipfire.org Git - thirdparty/git.git/commitdiff
utf8-bom: introduce skip_utf8_bom() helper
authorJunio C Hamano <gitster@pobox.com>
Thu, 16 Apr 2015 17:45:29 +0000 (10:45 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 16 Apr 2015 18:35:06 +0000 (11:35 -0700)
With the recent change to ignore the UTF8 BOM at the beginning of
.gitignore files, we now have two codepaths that do such a skipping
(the other one is for reading the configuration files).

Introduce utf8_bom[] constant string and skip_utf8_bom() helper
and teach .gitignore code how to use it.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
utf8.c
utf8.h

diff --git a/dir.c b/dir.c
index b5bb38977bbd1f84e8e93ba5e695760b172d300e..4c4bf910fa2b950c094cfedc1a24ab5ce6c088ac 100644 (file)
--- a/dir.c
+++ b/dir.c
@@ -12,6 +12,7 @@
 #include "refs.h"
 #include "wildmatch.h"
 #include "pathspec.h"
+#include "utf8.h"
 
 struct path_simplify {
        int len;
@@ -538,7 +539,6 @@ int add_excludes_from_file_to_list(const char *fname,
        struct stat st;
        int fd, i, lineno = 1;
        size_t size = 0;
-       static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
        char *buf, *entry;
 
        fd = open(fname, O_RDONLY);
@@ -576,10 +576,9 @@ int add_excludes_from_file_to_list(const char *fname,
 
        el->filebuf = buf;
 
-       if (size >= 3 && !memcmp(buf, utf8_bom, 3)) {
-               buf += 3;
-               size -= 3;
-       }
+       if (skip_utf8_bom(&buf, size))
+               size -= buf - el->filebuf;
+
        entry = buf;
 
        for (i = 0; i < size; i++) {
diff --git a/utf8.c b/utf8.c
index 520fbb4994ab1bdcfa0bc4589a0ca5131a89c490..28e6d76a425db4c16a8cc32e6f17c7aa72c2b1f0 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -633,3 +633,14 @@ int is_hfs_dotgit(const char *path)
 
        return 1;
 }
+
+const char utf8_bom[] = "\357\273\277";
+
+int skip_utf8_bom(char **text, size_t len)
+{
+       if (len < strlen(utf8_bom) ||
+           memcmp(*text, utf8_bom, strlen(utf8_bom)))
+               return 0;
+       *text += strlen(utf8_bom);
+       return 1;
+}
diff --git a/utf8.h b/utf8.h
index e4d9183c5fec81f8dbc75d1f2aea136f9b397a72..e7b2aa416844a0b2ccb2d2cf8a1bce68c4d60be1 100644 (file)
--- a/utf8.h
+++ b/utf8.h
@@ -13,6 +13,9 @@ int same_encoding(const char *, const char *);
 __attribute__((format (printf, 2, 3)))
 int utf8_fprintf(FILE *, const char *, ...);
 
+extern const char utf8_bom[];
+extern int skip_utf8_bom(char **, size_t);
+
 void strbuf_add_wrapped_text(struct strbuf *buf,
                const char *text, int indent, int indent2, int width);
 void strbuf_add_wrapped_bytes(struct strbuf *buf, const char *data, int len,