fix target-triple handling
[cparser] / builtins / builtins.c
1 static inline char *strchr(const char *s, int c)
2 {
3         do {
4                 if (*s == c)
5                         return (char*) s;
6         } while (*s++ != '\0');
7         return (char*) 0;
8 }
9
10 static inline char *strrchr(const char *s, int c)
11 {
12         const char *result = (const char*) 0;
13
14         do {
15                 if (*s == c)
16                         result = s;
17         } while (*s++ != '\0');
18         return (char*) result;
19 }
20
21 static inline int strcmp(const char *s1, const char *s2)
22 {
23         for( ; *s1 != 0; ++s1, ++s2) {
24                 if(*s1 != *s2)
25                         break;
26         }
27         return (unsigned char)*s1 - (unsigned char)*s2;
28 }
29
30 /*
31 static inline __SIZE_TYPE__ strlen(const char *s)
32 {
33         __SIZE_TYPE__ result = 0;
34         for ( ; *s != 0; ++s)
35                 result++;
36         return result;
37 }
38 */
39
40 static inline __SIZE_TYPE__ strlen(const char *str)
41 {
42         const char          *char_ptr;
43         const unsigned long *long_ptr;
44         unsigned long int longword, magic_bits, himagic, lomagic;
45         int abort(void);
46
47         for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof(longword)-1)) != 0; ++char_ptr) {
48                 if (*char_ptr == '\0')
49                         return char_ptr - str;
50         }
51
52         long_ptr = (unsigned long int*) char_ptr;
53         magic_bits = 0x7efefeffL;
54         himagic    = 0x80808080L;
55         lomagic    = 0x01010101L;
56         if (sizeof(longword) > 4)
57                 abort();
58
59         for(;;) {
60                 longword = *long_ptr++;
61                 if (((longword - lomagic) & himagic) != 0) {
62                         const char *cp = (const char*) (long_ptr - 1);
63                         if (cp[0] == 0)
64                                 return cp-str;
65                         if (cp[1] == 0)
66                                 return cp-str+1;
67                         if (cp[2] == 0)
68                                 return cp-str+2;
69                         if (cp[3] == 0)
70                                 return cp-str+3;
71                 }
72         }
73 }
74
75 static inline char *strcpy(char *dest, const char *source)
76 {
77         char *d = dest;
78         while ((*d++ = *source++) != '\0') {}
79         return dest;
80 }