int strcmp (p1, p2) const char *p1; const char *p2; { register const unsigned char *s1 = (const unsigned char *) p1; register const unsigned char *s2 = (const unsigned char *) p2; unsigned reg_char c1, c2;//reg_char is defined in memcopy.h:#define reg_char char do { c1 = (unsigned char) *s1++; c2 = (unsigned char) *s2++; if (c1 == '/0') return c1 - c2; } while (c1 == c2); return c1 - c2; } char * strcpy (dest, src) char *dest; const char *src; { reg_char c; char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src); const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1; size_t n; do { c = *s++; s[off] = c; } while (c != '/0'); n = s - src; (void) CHECK_BOUNDS_HIGH (src + n); (void) CHECK_BOUNDS_HIGH (dest + n); return dest; } # define BOUNDS_VIOLATED (__builtin_trap (), 0) /* Verify that pointer's value >= low. Return pointer value. */ # define CHECK_BOUNDS_LOW(ARG) / (((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED), / __ptrvalue (ARG)) /* Verify that pointer's value < high. Return pointer value. */ # define CHECK_BOUNDS_HIGH(ARG) / (((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED), / __ptrvalue (ARG)) char * strcat (dest, src) char *dest; const char *src; { char *s1 = dest; const char *s2 = src; reg_char c; /* Find the end of the string. */ do c = *s1++; while (c != '/0'); /* Make S1 point before the next character, so we can increment it while memory is read (wins on pipelined cpus). */ s1 -= 2; do { c = *s2++; *++s1 = c; } while (c != '/0'); return dest; }