blob: 9cff5ece858e6d95d850d41d9939a1132064305c [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 Lattnerc1e20ac2002-03-08 23:20:52 +00009
Chris Lattnerd6c68c42002-07-18 00:15:29 +000010size_t strlen(const char *Str) {
11 size_t Count = 0;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000012 while (*Str) { ++Count; ++Str; }
13 return Count;
14}
15
16char *strdup(const char *str) {
Chris Lattnera8032092004-02-19 21:44:41 +000017 size_t Len = strlen(str);
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000018 char *Result = (char*)malloc((Len+1)*sizeof(char));
19 memcpy(Result, str, Len+1);
20 return Result;
21}
22
Chris Lattnera8032092004-02-19 21:44:41 +000023char *strndup(const char *str, size_t n) {
24 size_t Len = strlen(str);
25 if (Len > n) Len = n;
26 char *Result = (char*)malloc((Len+1)*sizeof(char));
27 memcpy(Result, str, Len);
28 Result[Len] = 0;
29 return Result;
30}
31
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000032char *strcpy(char *s1, const char *s2) {
Chris Lattner68172da2003-10-21 17:53:16 +000033 char *dest = s1;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000034 while ((*s1++ = *s2++));
Chris Lattner68172da2003-10-21 17:53:16 +000035 return dest;
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000036}
37
Chris Lattner3da12582004-02-20 20:15:47 +000038char *strncpy(char *s1, const char *s2, size_t n) {
39 char *dest = s1;
40 while (n-- && (*s1++ = *s2++));
41 return dest;
42}
43
Chris Lattner4ee8dd72002-03-11 17:46:50 +000044char *strcat(char *s1, const char *s2) {
45 strcpy(s1+strlen(s1), s2);
46 return s1;
47}
48
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000049
50/* Compare S1 and S2, returning less than, equal to or
51 greater than zero if S1 is lexicographically less than,
52 equal to or greater than S2. */
53int strcmp (const char *p1, const char *p2) {
54 register const unsigned char *s1 = (const unsigned char *) p1;
55 register const unsigned char *s2 = (const unsigned char *) p2;
56 unsigned char c1, c2;
57
58 do
59 {
60 c1 = (unsigned char) *s1++;
61 c2 = (unsigned char) *s2++;
62 if (c1 == '\0')
63 return c1 - c2;
64 }
65 while (c1 == c2);
66
67 return c1 - c2;
68}
69
70// http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/?cvsroot=glibc
Chris Lattner8fc62582003-02-18 20:42:15 +000071#if 0
Chris Lattnerc1e20ac2002-03-08 23:20:52 +000072typedef unsigned int op_t;
73#define OPSIZ 4
74
75void *memset (void *dstpp, int c, size_t len) {
76 long long int dstp = (long long int) dstpp;
77
78 if (len >= 8)
79 {
80 size_t xlen;
81 op_t cccc;
82
83 cccc = (unsigned char) c;
84 cccc |= cccc << 8;
85 cccc |= cccc << 16;
86 if (OPSIZ > 4)
87 /* Do the shift in two steps to avoid warning if long has 32 bits. */
88 cccc |= (cccc << 16) << 16;
89
90 /* There are at least some bytes to set.
91 No need to test for LEN == 0 in this alignment loop. */
92 while (dstp % OPSIZ != 0)
93 {
94 ((unsigned char *) dstp)[0] = c;
95 dstp += 1;
96 len -= 1;
97 }
98
99 /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
100 xlen = len / (OPSIZ * 8);
101 while (xlen > 0)
102 {
103 ((op_t *) dstp)[0] = cccc;
104 ((op_t *) dstp)[1] = cccc;
105 ((op_t *) dstp)[2] = cccc;
106 ((op_t *) dstp)[3] = cccc;
107 ((op_t *) dstp)[4] = cccc;
108 ((op_t *) dstp)[5] = cccc;
109 ((op_t *) dstp)[6] = cccc;
110 ((op_t *) dstp)[7] = cccc;
111 dstp += 8 * OPSIZ;
112 xlen -= 1;
113 }
114 len %= OPSIZ * 8;
115
116 /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
117 xlen = len / OPSIZ;
118 while (xlen > 0)
119 {
120 ((op_t *) dstp)[0] = cccc;
121 dstp += OPSIZ;
122 xlen -= 1;
123 }
124 len %= OPSIZ;
125 }
126
127 /* Write the last few bytes. */
128 while (len > 0)
129 {
130 ((unsigned char *) dstp)[0] = c;
131 dstp += 1;
132 len -= 1;
133 }
134
135 return dstpp;
136}
Chris Lattner8fc62582003-02-18 20:42:15 +0000137#endif
Chris Lattnerc1e20ac2002-03-08 23:20:52 +0000138
139void *memcpy(void *dstpp, const void *srcpp, size_t len) {
140 char *dstp = (char*)dstpp;
141 char *srcp = (char*) srcpp;
142 unsigned i;
143
144 for (i = 0; i < len; ++i)
145 dstp[i] = srcp[i];
146
147 return dstpp;
148}