From 865258432a1a335a2858b74e07e3e2c69db025af Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Mon, 22 Sep 2008 18:42:50 +0000 Subject: [PATCH] possibility to disable builtin functions [r22178] --- builtins/builtins.c | 37 +++++++++++++++++++++++++++++++++++++ main.c | 4 +++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/builtins/builtins.c b/builtins/builtins.c index 3342563..026f8e2 100644 --- a/builtins/builtins.c +++ b/builtins/builtins.c @@ -27,6 +27,7 @@ static inline int strcmp(const char *s1, const char *s2) return (unsigned char)*s1 - (unsigned char)*s2; } +/* static inline __SIZE_TYPE__ strlen(const char *s) { __SIZE_TYPE__ result = 0; @@ -34,6 +35,42 @@ static inline __SIZE_TYPE__ strlen(const char *s) result++; return result; } +*/ + +static inline __SIZE_TYPE__ strlen(const char *str) +{ + const char *char_ptr; + const unsigned long *long_ptr; + unsigned long int longword, magic_bits, himagic, lomagic; + int abort(void); + + for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof(longword)-1)) != 0; ++char_ptr) { + if (*char_ptr == '\0') + return char_ptr - str; + } + + long_ptr = (unsigned long int*) char_ptr; + magic_bits = 0x7efefeffL; + himagic = 0x80808080L; + lomagic = 0x01010101L; + if (sizeof(longword) > 4) + abort(); + + for(;;) { + longword = *long_ptr++; + if (((longword - lomagic) & himagic) != 0) { + const char *cp = (const char*) (long_ptr - 1); + if (cp[0] == 0) + return cp-str; + if (cp[1] == 0) + return cp-str+1; + if (cp[2] == 0) + return cp-str+2; + if (cp[3] == 0) + return cp-str+3; + } + } +} static inline char *strcpy(char *dest, const char *source) { diff --git a/main.c b/main.c index 2497541..b137518 100644 --- a/main.c +++ b/main.c @@ -567,11 +567,11 @@ int main(int argc, char **argv) default: case 4: set_option("strict-aliasing"); + use_builtins = true; /* fallthrough */ case 3: set_option("cond-eval"); set_option("if-conv"); - use_builtins = true; /* fallthrough */ case 2: set_option("inline"); @@ -677,6 +677,8 @@ int main(int argc, char **argv) if (streq(opt, "dollars-in-identifiers")) { allow_dollar_in_symbol = truth_value; + } if (streq(opt, "builtins")) { + use_builtins = truth_value; } else if (streq(opt, "short-wchar")) { opt_short_wchar_t = truth_value; } else if (streq(opt, "syntax-only")) { -- 2.20.1