Blame | Last modification | View Log | Download | RSS feed
/* ACC -- Automatic Compiler ConfigurationCopyright (C) 1996-2004 Markus Franz Xaver Johannes OberhumerAll Rights Reserved.This software is a copyrighted work licensed under the terms ofthe GNU General Public License. Please consult the file "ACC_LICENSE"for details.Markus F.X.J. Oberhumer<markus@oberhumer.com>http://www.oberhumer.com/*/#define __ACCLIB_HSTRING_CH_INCLUDED 1#if !defined(ACCLIB_PUBLIC)# define ACCLIB_PUBLIC(r,f) r __ACCLIB_FUNCNAME(f)#endif/***********************************************************************// strlen************************************************************************/ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlen) (const acc_hchar_p s){/* TODO: which one is the fastest generic version? */#if 1const acc_hchar_p start = s; while (*s) ++s;return (acc_hsize_t) (s - start);#elif 1acc_hsize_t n = 0; while (*s) ++s, ++n; return n;#elif 1acc_hsize_t n = 0; while (s[n]) ++n; return n;#endif}/***********************************************************************// strcmp, strncmp, ascii_stricmp, ascii_strnicmp, ascii_memicmp************************************************************************/ACCLIB_PUBLIC(int, acc_hstrcmp) (const acc_hchar_p p, const acc_hchar_p s){for ( ; *p; ++p, ++s) {if (*p != *s)break;}return (unsigned char)*p - (unsigned char)*s;}ACCLIB_PUBLIC(int, acc_hstrncmp) (const acc_hchar_p p, const acc_hchar_p s, acc_hsize_t n){for ( ; *p && n > 0; ++p, ++s, --n) {if (*p != *s)break;}return (unsigned char)*p - (unsigned char)*s;}ACCLIB_PUBLIC(int, acc_ascii_hstricmp) (const acc_hchar_p p, const acc_hchar_p s){for ( ; *p; ++p, ++s) {if (*p != *s) {int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);if (d != 0)return d;}}return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);}ACCLIB_PUBLIC(int, acc_ascii_hstrnicmp) (const acc_hchar_p p, const acc_hchar_p s, acc_hsize_t n){for ( ; *p && n > 0; ++p, ++s, --n) {if (*p != *s) {int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);if (d != 0)return d;}}return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);}ACCLIB_PUBLIC(int, acc_ascii_hmemicmp) (const acc_hvoid_p pp, const acc_hvoid_p ss, acc_hsize_t n){const acc_hbyte_p p = (const acc_hbyte_p) pp;const acc_hbyte_p s = (const acc_hbyte_p) ss;for ( ; n > 0; ++p, ++s, --n) {if (*p != *s) {int d = acc_ascii_utolower(*p) - acc_ascii_utolower(*s);if (d != 0)return d;}}return acc_ascii_utolower(*p) - acc_ascii_utolower(*s);}/***********************************************************************// strstr, ascii_stristr, memmem, ascii_memimem************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrstr) (const acc_hchar_p p, const acc_hchar_p s){acc_hsize_t pn = __ACCLIB_FUNCNAME(acc_hstrlen)(p);acc_hsize_t sn = __ACCLIB_FUNCNAME(acc_hstrlen)(s);return (acc_hchar_p) __ACCLIB_FUNCNAME(acc_hmemmem)(p, pn, s, sn);}ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstristr) (const acc_hchar_p p, const acc_hchar_p s){acc_hsize_t pn = __ACCLIB_FUNCNAME(acc_hstrlen)(p);acc_hsize_t sn = __ACCLIB_FUNCNAME(acc_hstrlen)(s);return (acc_hchar_p) __ACCLIB_FUNCNAME(acc_ascii_hmemimem)(p, pn, s, sn);}ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemmem) (const acc_hvoid_p p, acc_hsize_t pn, const acc_hvoid_p s, acc_hsize_t sn){#define __ACCLIB_REQUIRE_HMEMCPY_CH 1if (sn == 0) __ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)for ( ; pn >= sn; --pn) {if (__ACCLIB_FUNCNAME(acc_hmemcmp)(p, s, sn) == 0)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)p = (const acc_hbyte_p)p + 1;}return (acc_hvoid_p) 0;}ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemimem) (const acc_hvoid_p p, acc_hsize_t pn, const acc_hvoid_p s, acc_hsize_t sn){if (sn == 0) __ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)for ( ; pn >= sn; --pn) {if (__ACCLIB_FUNCNAME(acc_ascii_hmemicmp)(p, s, sn) == 0)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)p = (const acc_hbyte_p)p + 1;}return (acc_hvoid_p) 0;}/***********************************************************************// strcpy, strcat************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrcpy) (acc_hchar_p d, const acc_hchar_p s){acc_hchar_p dest = d;while ((*d = *s) != 0) {++d; ++s;}return dest;}ACCLIB_PUBLIC(acc_hchar_p, acc_hstrcat) (acc_hchar_p d, const acc_hchar_p s){acc_hchar_p dest = d;while (*d) ++d;while ((*d = *s) != 0) {++d; ++s;}return dest;}/***********************************************************************// strlcpy, strlcat************************************************************************/ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlcpy) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size){acc_hsize_t n = 0;if (n != size) {do {if ((*d = *s) == 0) return n;++d; ++s; ++n;} while (n != size);d[-1] = 0;}while (*s) ++s, ++n;return n;}ACCLIB_PUBLIC(acc_hsize_t, acc_hstrlcat) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size){acc_hsize_t n = 0;while (*d && n != size) ++d, ++n;if (n != size) {do {if ((*d = *s) == 0) return n;++d; ++s; ++n;} while (n != size);d[-1] = 0;}while (*s) ++s, ++n;return n;}/***********************************************************************// strscpy, strscat// (same as strlcpy/strlcat, but just return -1 in case of failure)************************************************************************/ACCLIB_PUBLIC(int, acc_hstrscpy) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size){acc_hsize_t n = 0;if (n != size) {do {if ((*d = *s) == 0) return 0;++d; ++s; ++n;} while (n != size);d[-1] = 0;}return -1;}ACCLIB_PUBLIC(int, acc_hstrscat) (acc_hchar_p d, const acc_hchar_p s, acc_hsize_t size){acc_hsize_t n = 0;while (*d && n != size) ++d, ++n;if (n != size) {do {if ((*d = *s) == 0) return 0;++d; ++s; ++n;} while (n != size);d[-1] = 0;}return -1;}/***********************************************************************// strccpy, memccpy************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrccpy) (acc_hchar_p d, const acc_hchar_p s, int c){for (;;) {if ((*d = *s) == 0) break;if (*d++ == (char) c) return d;++s;}return (acc_hchar_p) 0;}ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemccpy) (acc_hvoid_p d, const acc_hvoid_p s, int c, acc_hsize_t n){acc_hbyte_p a = (acc_hbyte_p) d;const acc_hbyte_p p = (const acc_hbyte_p) s;const acc_hbyte_p e = (const acc_hbyte_p) s + n;while (p != e) {if ((*a++ = *p++) == (unsigned char) c)return a;}return (acc_hvoid_p) 0;}/***********************************************************************// strchr, strrchr, ascii_strichr, ascii_strrichr************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrchr) (const acc_hchar_p s, int c){for ( ; *s; ++s) {if (*s == (char) c)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}if ((char) c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)return (acc_hchar_p) 0;}ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrchr) (const acc_hchar_p s, int c){const acc_hchar_p start = s;while (*s) ++s;if ((char) c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)for (;;) {if (s == start) break; --s;if (*s == (char) c)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}return (acc_hchar_p) 0;}ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrichr) (const acc_hchar_p s, int c){c = acc_ascii_utolower(c);for ( ; *s; ++s) {if (acc_ascii_utolower(*s) == c)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}if (c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)return (acc_hchar_p) 0;}ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrrichr) (const acc_hchar_p s, int c){const acc_hchar_p start = s;c = acc_ascii_utolower(c);while (*s) ++s;if (c == 0) __ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)for (;;) {if (s == start) break; --s;if (acc_ascii_utolower(*s) == c)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}return (acc_hchar_p) 0;}/***********************************************************************// memchr, memrchr, ascii_memichr, ascii_memrichr************************************************************************/ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemchr) (const acc_hvoid_p s, int c, acc_hsize_t n){const acc_hbyte_p p = (const acc_hbyte_p) s;const acc_hbyte_p e = (const acc_hbyte_p) s + n;while (p != e) {if (*p == (unsigned char) c)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)++p;}return (acc_hvoid_p) 0;}ACCLIB_PUBLIC(acc_hvoid_p, acc_hmemrchr) (const acc_hvoid_p s, int c, acc_hsize_t n){const acc_hbyte_p p = (const acc_hbyte_p) s + n;const acc_hbyte_p e = (const acc_hbyte_p) s;while (p != e) {--p;if (*p == (unsigned char) c)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)}return (acc_hvoid_p) 0;}ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemichr) (const acc_hvoid_p s, int c, acc_hsize_t n){const acc_hbyte_p p = (const acc_hbyte_p) s;const acc_hbyte_p e = (const acc_hbyte_p) s + n;c = acc_ascii_utolower(c);while (p != e) {if (acc_ascii_utolower(*p) == c)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)++p;}return (acc_hvoid_p) 0;}ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemrichr) (const acc_hvoid_p s, int c, acc_hsize_t n){const acc_hbyte_p p = (const acc_hbyte_p) s + n;const acc_hbyte_p e = (const acc_hbyte_p) s;c = acc_ascii_utolower(c);while (p != e) {--p;if (acc_ascii_utolower(*p) == c)__ACCLIB_CONST_CAST_RETURN(acc_hvoid_p, p)}return (acc_hvoid_p) 0;}/***********************************************************************// strspn, strrspn************************************************************************/ACCLIB_PUBLIC(acc_hsize_t, acc_hstrspn) (const acc_hchar_p s, const acc_hchar_p accept){acc_hsize_t n = 0;for ( ; *s; ++s) {const acc_hchar_p a;for (a = accept; *a; ++a)if (*s == *a)goto acc_label_next;break;acc_label_next:++n;}return n;}ACCLIB_PUBLIC(acc_hsize_t, acc_hstrrspn) (const acc_hchar_p s, const acc_hchar_p accept){acc_hsize_t n = 0;const acc_hchar_p start = s;while (*s) ++s;for (;;) {const acc_hchar_p a;if (s == start) break; --s;for (a = accept; *a; ++a)if (*s == *a)goto acc_label_next;break;acc_label_next:++n;}return n;}/***********************************************************************// strcspn, strrcspn************************************************************************/ACCLIB_PUBLIC(acc_hsize_t, acc_hstrcspn) (const acc_hchar_p s, const acc_hchar_p reject){acc_hsize_t n = 0;for ( ; *s; ++s, ++n) {const acc_hchar_p r;for (r = reject; *r; ++r)if (*s == *r)return n;}return n;}ACCLIB_PUBLIC(acc_hsize_t, acc_hstrrcspn) (const acc_hchar_p s, const acc_hchar_p reject){acc_hsize_t n = 0;const acc_hchar_p start = s;while (*s) ++s;for ( ; ; ++n) {const acc_hchar_p r;if (s == start) break; --s;for (r = reject; *r; ++r)if (*s == *r)return n;}return n;}/***********************************************************************// strpbrk, strrpbrk************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrpbrk) (const acc_hchar_p s, const acc_hchar_p accept){for ( ; *s; ++s) {const acc_hchar_p a;for (a = accept; *a; ++a) {if (*s == *a)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}}return (acc_hchar_p) 0;}ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrpbrk) (const acc_hchar_p s, const acc_hchar_p accept){const acc_hchar_p start = s;while (*s) ++s;for (;;) {const acc_hchar_p a;if (s == start) break; --s;for (a = accept; *a; ++a) {if (*s == *a)__ACCLIB_CONST_CAST_RETURN(acc_hchar_p, s)}}return (acc_hchar_p) 0;}/***********************************************************************// strsep, strrsep************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_hstrsep) (acc_hchar_pp ss, const acc_hchar_p delim){acc_hchar_p s = *ss;if (s) {acc_hchar_p p = __ACCLIB_FUNCNAME(acc_hstrpbrk)(s, delim);if (p) *p++ = 0;*ss = p;}return s;}ACCLIB_PUBLIC(acc_hchar_p, acc_hstrrsep) (acc_hchar_pp ss, const acc_hchar_p delim){acc_hchar_p s = *ss;if (s) {acc_hchar_p p = __ACCLIB_FUNCNAME(acc_hstrrpbrk)(s, delim);if (p) {*p++ = 0;return p;}*ss = (acc_hchar_p) 0;}return s;}/***********************************************************************// ascii_strlwr, ascii_strupr, ascii_memlwr, ascii_memupr************************************************************************/ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrlwr) (acc_hchar_p s){acc_hbyte_p p = (acc_hbyte_p) s;for ( ; *p; ++p)*p = (unsigned char) acc_ascii_utolower(*p);return s;}ACCLIB_PUBLIC(acc_hchar_p, acc_ascii_hstrupr) (acc_hchar_p s){acc_hbyte_p p = (acc_hbyte_p) s;for ( ; *p; ++p)*p = (unsigned char) acc_ascii_utoupper(*p);return s;}ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemlwr) (acc_hvoid_p s, acc_hsize_t n){acc_hbyte_p p = (acc_hbyte_p) s;acc_hbyte_p e = (acc_hbyte_p) s + n;for ( ; p != e; ++p)*p = (unsigned char) acc_ascii_utolower(*p);return s;}ACCLIB_PUBLIC(acc_hvoid_p, acc_ascii_hmemupr) (acc_hvoid_p s, acc_hsize_t n){acc_hbyte_p p = (acc_hbyte_p) s;acc_hbyte_p e = (acc_hbyte_p) s + n;for ( ; p != e; ++p)*p = (unsigned char) acc_ascii_utoupper(*p);return s;}/*vi:ts=4:et*/