blob: 0ed4ced64c49787493324fa0f0d8bba3b1564f9a [file] [log] [blame]
Chris Lattnerc1e20ac2002-03-08 23:20:52 +00001//===-- string.c - String functions for the LLVM libc Library -----*- C -*-===//
2//
3// A lot of this code is ripped gratuitously from glibc and libiberty.
4//
5//===----------------------------------------------------------------------===//
6
7#include <stdlib.h>
Chris Lattnerf4b319d2003-08-28 14:35:12 +00008#include <string.h>
Chris Lattnerd6c68c42002-07-18 00:15:29 +00009void *malloc(size_t);
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000010void free(void *);
11
Chris Lattnerd6c68c42002-07-18 00:15:29 +000012size_t strlen(const char *Str) {
13 size_t Count = 0;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000014 while (*Str) { ++Count; ++Str; }
15 return Count;
16}
17
18char *strdup(const char *str) {
Chris Lattnerd6c68c42002-07-18 00:15:29 +000019 long Len = strlen(str);
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000020 char *Result = (char*)malloc((Len+1)*sizeof(char));
21 memcpy(Result, str, Len+1);
22 return Result;
23}
24
25char *strcpy(char *s1, const char *s2) {
Chris Lattner68172da2003-10-21 17:53:16 +000026 char *dest = s1;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000027 while ((*s1++ = *s2++));
Chris Lattner68172da2003-10-21 17:53:16 +000028 return dest;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000029}
30
Chris Lattner4ee8dd72002-03-11 17:46:50 +000031char *strcat(char *s1, const char *s2) {
32 strcpy(s1+strlen(s1), s2);
33 return s1;
34}
35
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000036
37/* Compare S1 and S2, returning less than, equal to or
38 greater than zero if S1 is lexicographically less than,
39 equal to or greater than S2. */
40int strcmp (const char *p1, const char *p2) {
41 register const unsigned char *s1 = (const unsigned char *) p1;
42 register const unsigned char *s2 = (const unsigned char *) p2;
43 unsigned char c1, c2;
44
45 do
46 {
47 c1 = (unsigned char) *s1++;
48 c2 = (unsigned char) *s2++;
49 if (c1 == '\0')
50 return c1 - c2;
51 }
52 while (c1 == c2);
53
54 return c1 - c2;
55}
56
57// http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/?cvsroot=glibc
Chris Lattner8fc62582003-02-18 20:42:15 +000058#if 0
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000059typedef unsigned int op_t;
60#define OPSIZ 4
61
62void *memset (void *dstpp, int c, size_t len) {
63 long long int dstp = (long long int) dstpp;
64
65 if (len >= 8)
66 {
67 size_t xlen;
68 op_t cccc;
69
70 cccc = (unsigned char) c;
71 cccc |= cccc << 8;
72 cccc |= cccc << 16;
73 if (OPSIZ > 4)
74 /* Do the shift in two steps to avoid warning if long has 32 bits. */
75 cccc |= (cccc << 16) << 16;
76
77 /* There are at least some bytes to set.
78 No need to test for LEN == 0 in this alignment loop. */
79 while (dstp % OPSIZ != 0)
80 {
81 ((unsigned char *) dstp)[0] = c;
82 dstp += 1;
83 len -= 1;
84 }
85
86 /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
87 xlen = len / (OPSIZ * 8);
88 while (xlen > 0)
89 {
90 ((op_t *) dstp)[0] = cccc;
91 ((op_t *) dstp)[1] = cccc;
92 ((op_t *) dstp)[2] = cccc;
93 ((op_t *) dstp)[3] = cccc;
94 ((op_t *) dstp)[4] = cccc;
95 ((op_t *) dstp)[5] = cccc;
96 ((op_t *) dstp)[6] = cccc;
97 ((op_t *) dstp)[7] = cccc;
98 dstp += 8 * OPSIZ;
99 xlen -= 1;
100 }
101 len %= OPSIZ * 8;
102
103 /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
104 xlen = len / OPSIZ;
105 while (xlen > 0)
106 {
107 ((op_t *) dstp)[0] = cccc;
108 dstp += OPSIZ;
109 xlen -= 1;
110 }
111 len %= OPSIZ;
112 }
113
114 /* Write the last few bytes. */
115 while (len > 0)
116 {
117 ((unsigned char *) dstp)[0] = c;
118 dstp += 1;
119 len -= 1;
120 }
121
122 return dstpp;
123}
Chris Lattner8fc62582003-02-18 20:42:15 +0000124#endif
Chris Lattnerc1e20ac2002-03-08 23:20:52 +0000125
126void *memcpy(void *dstpp, const void *srcpp, size_t len) {
127 char *dstp = (char*)dstpp;
128 char *srcp = (char*) srcpp;
129 unsigned i;
130
131 for (i = 0; i < len; ++i)
132 dstp[i] = srcp[i];
133
134 return dstpp;
135}