Fixes to Libc, Doxygen Comments and VTerm layout
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / string.c
1 /*
2  * AcessOS Basic C Library
3  * string.c
4  */
5 #include <acess/sys.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include "lib.h"
9
10 /**
11  * \fn EXPORT int strcmp(const char *s1, const char *s2)
12  * \brief Compare two strings
13  */
14 EXPORT int strcmp(const char *s1, const char *s2)
15 {
16         while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
17                 s1++; s2++;
18         }
19         return (int)*s1 - (int)*s2;
20 }
21
22 /**
23  * \fn EXPORT char *strcpy(char *dst, const char *src)
24  * \brief Copy a string to another
25  */
26 EXPORT char *strcpy(char *dst, const char *src)
27 {
28         char *_dst = dst;
29         while(*src) {
30                 *dst = *src;
31                 src++; dst++;
32         }
33         *dst = '\0';
34         return _dst;
35 }
36
37 /**
38  * \fn EXPORT char *strncpy(char *dst, const char *src)
39  * \brief Copy at most \a num characters from \a src to \a dst
40  * \return \a dst
41  */
42 EXPORT char *strncpy(char *dst, const char *src, size_t num)
43 {
44         char *to = dst;
45         while(*src && num--)    *to++ = *src++;
46         *to = '\0';
47         return dst;
48 }
49
50 /**
51  * \fn EXPORT char *strcat(char *dst, const char *src)
52  * \brief Append a string onto another
53  */
54 EXPORT char *strcat(char *dst, const char *src)
55 {
56         char    *to = dst;
57         // Find the end
58         while(*to)      to++;
59         // Copy
60         while(*src)     *to++ = *src++;
61         // End string
62         *to = '\0';
63         return dst;
64 }
65
66 /**
67  * \fn EXPORT int strlen(const char *str)
68  * \brief Get the length of a string
69  */
70 EXPORT int strlen(const char *str)
71 {
72         int retval;
73         for(retval = 0; *str != '\0'; str++)
74                 retval++;
75         return retval;
76 }
77
78 /**
79  * \fn EXPORT int strncmp(const char *s1, const char *s2, size_t len)
80  * \brief Compare two strings with a limit
81  */
82 EXPORT int strncmp(const char *s1, const char *s2, size_t len)
83 {
84         while(--len && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
85                 s1++; s2++;
86         }
87         return (int)*s1 - (int)*s2;
88 }
89
90 /**
91  * \fn EXPORT char *strdup(const char *str)
92  * \brief Duplicate a string using heap memory
93  * \note Defined in POSIX Spec, not C spec
94  */
95 EXPORT char *strdup(const char *str)
96 {
97         size_t  len = strlen(str);
98         char    *ret = malloc(len+1);
99         if(ret == NULL) return NULL;
100         strcpy(ret, str);
101         return ret;
102 }
103
104 /**
105  * \fn EXPORT char *strchr(char *str, int character)
106  * \brief Locate a character in a string
107  */
108 EXPORT char *strchr(char *str, int character)
109 {
110         while(*str)
111         {
112                 if(*str == character)   return str;
113         }
114         return NULL;
115 }
116
117 /**
118  * \fn EXPORT char *strrchr(char *str, int character)
119  * \brief Locate the last occurance of a character in a string
120  */
121 EXPORT char *strrchr(char *str, int character)
122 {
123          int    i;
124         i = strlen(str)-1;
125         while(i--)
126         {
127                 if(str[i] == character) return &str[i];
128         }
129         return NULL;
130 }
131
132 /**
133  * \fn EXPORT char *strstr(char *str1, const char *str2)
134  * \brief Search a \a str1 for the first occurance of \a str2
135  */
136 EXPORT char *strstr(char *str1, const char *str2)
137 {
138         const char      *test = str2;
139         
140         while(*str1)
141         {
142                 if(*test == '\0')       return str1;
143                 if(*str1 == *test)      test++;
144                 else    test = str2;
145                 str1 ++;
146         }
147         return NULL;
148 }
149
150 // --- Memory ---
151 /**
152  * \fn EXPORT void *memset(void *dest, int val, size_t num)
153  * \brief Clear memory with the specified value
154  */
155 EXPORT void *memset(void *dest, int val, size_t num)
156 {
157         unsigned char *p = dest;
158         while(num--)    *p++ = val;
159         return dest;
160 }
161
162 /**
163  * \fn EXPORT void *memcpy(void *dest, const void *src, size_t count)
164  * \brief Copy one memory area to another
165  */
166 EXPORT void *memcpy(void *dest, const void *src, size_t count)
167 {
168     char *sp = (char *)src;
169     char *dp = (char *)dest;
170     for(;count--;) *dp++ = *sp++;
171     return dest;
172 }
173
174 /**
175  * \fn EXPORT void *memmove(void *dest, const void *src, size_t count)
176  * \brief Copy data in memory, avoiding overlap problems
177  */
178 EXPORT void *memmove(void *dest, const void *src, size_t count)
179 {
180     char *sp = (char *)src;
181     char *dp = (char *)dest;
182         // Check if corruption will happen
183         if( (unsigned int)dest > (unsigned int)src && (unsigned int)dest < (unsigned int)src+count )
184                 for(;count--;) dp[count] = sp[count];
185         else
186         for(;count--;) *dp++ = *sp++;
187     return dest;
188 }
189
190 /**
191  * \fn EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
192  * \brief Compare two regions of memory
193  * \param mem1  Region 1
194  * \param mem2  Region 2
195  * \param count Number of bytes to check
196  */
197 EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
198 {
199         while(count--)
200         {
201                 if( *(unsigned char*)mem1 != *(unsigned char*)mem2 )
202                         return *(unsigned char*)mem1 - *(unsigned char*)mem2;
203                 mem1 ++;
204                 mem2 ++;
205         }
206         return 0;
207 }
208
209 /**
210  * \fn EXPORT void *memchr(void *ptr, int value, size_t num)
211  * \brief Locates the first occurence of \a value starting at \a ptr
212  * \param ptr   Starting memory location
213  * \param value Value to find
214  * \param num   Size of memory area to check
215  */
216 EXPORT void *memchr(void *ptr, int value, size_t num)
217 {
218         while(num--)
219         {
220                 if( *(unsigned char*)ptr == (unsigned char)value )
221                         return ptr;
222                 ptr ++;
223         }
224         return NULL;
225 }

UCC git Repository :: git.ucc.asn.au