You need to cast those arguments of tolower to (unsigned char). That's arguably a bug of the language. Character values less than zero aren't valid for tolower, unless they happen to equal EOF in which case the tolower calls don't mean what you want them to mean. Per the man page: "If c is neither an unsigned char value nor EOF, the behavior of these functions is undefined." M. On Thu, Mar 15, 2018 at 6:57 PM, <lars.schneider@xxxxxxxxxxxx> wrote: > From: Lars Schneider <larsxschneider@xxxxxxxxx> > > Check in a case insensitive manner if one string is a prefix of another > string. > > This function is used in a subsequent commit. > > Signed-off-by: Lars Schneider <larsxschneider@xxxxxxxxx> > --- > git-compat-util.h | 1 + > strbuf.c | 9 +++++++++ > 2 files changed, 10 insertions(+) > > diff --git a/git-compat-util.h b/git-compat-util.h > index 68b2ad531e..95c9b34832 100644 > --- a/git-compat-util.h > +++ b/git-compat-util.h > @@ -455,6 +455,7 @@ extern void (*get_warn_routine(void))(const char *warn, va_list params); > extern void set_die_is_recursing_routine(int (*routine)(void)); > > extern int starts_with(const char *str, const char *prefix); > +extern int istarts_with(const char *str, const char *prefix); > > /* > * If the string "str" begins with the string found in "prefix", return 1. > diff --git a/strbuf.c b/strbuf.c > index b635f0bdc4..99812b8488 100644 > --- a/strbuf.c > +++ b/strbuf.c > @@ -11,6 +11,15 @@ int starts_with(const char *str, const char *prefix) > return 0; > } > > +int istarts_with(const char *str, const char *prefix) > +{ > + for (; ; str++, prefix++) > + if (!*prefix) > + return 1; > + else if (tolower(*str) != tolower(*prefix)) > + return 0; > +} > + > int skip_to_optional_arg_default(const char *str, const char *prefix, > const char **arg, const char *def) > { > -- > 2.16.2 >