001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020 #include "klibc.h"
021
022
023 void *memcpy(void *dst0, const void *src0, register unsigned int size)
024 {
025 char *dst;
026 const char *src;
027 for (dst = (char*)dst0, src = (const char*)src0 ;
028 size > 0 ;
029 dst++, src++, size--)
030 *dst = *src;
031 return dst0;
032 }
033
034
035 void *memset(void *dst0, register int c, register unsigned int length)
036 {
037 char *dst;
038 for (dst = (char*) dst0 ;
039 length > 0 ;
040 dst++, length --)
041 *dst = (char)c;
042 return dst0;
043 }
044
045 int memcmp(const void *s1, const void *s2, sos_size_t len)
046 {
047 const unsigned char *c1, *c2;
048 unsigned int i;
049
050 for (i = 0, c1 = s1, c2 = s2; i < len; i++, c1++, c2++)
051 {
052 if(*c1 != *c2)
053 return *c1 - *c2;
054 }
055
056 return 0;
057 }
058
059
060 unsigned int strlen(register const char *str)
061 {
062 unsigned int retval = 0;
063
064 while (*str++)
065 retval++;
066
067 return retval;
068 }
069
070
071 unsigned int strnlen(const char * s, sos_size_t count)
072 {
073 const char *sc;
074
075 for (sc = s; count-- && *sc != '\0'; ++sc)
076 ;
077 return sc - s;
078 }
079
080
081 char *strzcpy(register char *dst, register const char *src, register int len)
082 {
083 int i;
084
085 for (i = 0; i < len; i++)
086 {
087 dst[i] = src[i];
088 if(src[i] == '\0')
089 return dst;
090 }
091
092 dst[len-1] = '\0';
093 return dst;
094 }
095
096 char *strzcat (char *dest, const char *src, sos_size_t n)
097 {
098 char *res = dest;
099
100 for ( ; *dest ; dest++);
101
102 for ( ; *src ; src++, dest++) {
103 *dest = *src;
104 n--;
105 if (n <= 0)
106 break;
107 }
108
109 *dest = '\0';
110 return res;
111 }
112
113 int strcmp(register const char *s1, register const char *s2)
114 {
115 while (*s1 == *s2++)
116 if (*s1++ == 0)
117 return (0);
118
119 return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
120 }
121
122
123 int strncmp(register const char *s1, register const char *s2, register int len)
124 {
125 char c1 = '\0', c2 = '\0';
126
127 while (len > 0)
128 {
129 c1 = (unsigned char) *s1++;
130 c2 = (unsigned char) *s2++;
131 if (c1 == '\0' || c1 != c2)
132 return c1 - c2;
133 len--;
134 }
135
136 return c1 - c2;
137 }
138
139
140
141
142 int vsnprintf(char *buff, sos_size_t len, const char * format, va_list ap)
143 {
144 sos_size_t i, result;
145
146 if (!buff || !format || (len < 0))
147 return -1;
148
149 #define PUTCHAR(thechar) \
150 do { \
151 if (result < len-1) \
152 *buff++ = (thechar); \
153 result++; \
154 } while (0)
155
156 result = 0;
157 for(i=0 ; format[i] != '\0' ; i++){
158 switch (format[i])
159 {
160 case '%':
161 i++;
162 switch(format[i])
163 {
164 case '%':
165 {
166 PUTCHAR('%');
167 break;
168 }
169 case 'i':;
170 case 'd':
171 {
172 int integer = va_arg(ap,int);
173 int cpt2 = 0;
174 char buff_int[16];
175
176 if (integer<0)
177 PUTCHAR('-');
178
179
180
181 do {
182 int m10 = integer%10;
183 m10 = (m10 < 0)? -m10:m10;
184 buff_int[cpt2++]=(char)('0'+ m10);
185 integer=integer/10;
186 } while(integer!=0);
187
188 for(cpt2 = cpt2 - 1 ; cpt2 >= 0 ; cpt2--)
189 PUTCHAR(buff_int[cpt2]);
190
191 break;
192 }
193
194 case 'c':
195 {
196 int value = va_arg(ap,int);
197 PUTCHAR((char)value);
198 break;
199 }
200
201 case 's':
202 {
203 char *string = va_arg(ap,char *);
204 if (! string)
205 string = "(null)";
206 for( ; *string != '\0' ; string++)
207 PUTCHAR(*string);
208 break;
209 }
210
211 case 'x':
212 {
213 unsigned int hexa = va_arg(ap,int);
214 unsigned int nb;
215 int i, had_nonzero = 0;
216 for(i=0 ; i < 8 ; i++)
217 {
218 nb = (unsigned int)(hexa << (i*4));
219 nb = (nb >> 28) & 0xf;
220
221 if (nb == 0)
222 {
223 if (had_nonzero)
224 PUTCHAR('0');
225 }
226 else
227 {
228 had_nonzero = 1;
229 if (nb < 10)
230 PUTCHAR('0'+nb);
231 else
232 PUTCHAR('a'+(nb-10));
233 }
234 }
235 if (! had_nonzero)
236 PUTCHAR('0');
237 break;
238 }
239 break;
240
241 default:
242 PUTCHAR('%');
243 PUTCHAR(format[i]);
244 }
245 break;
246
247 default:
248 PUTCHAR(format[i]);
249 }
250 }
251
252 *buff = '\0';
253 return result;
254 }
255
256
257 int snprintf(char * buff, sos_size_t len, const char *format, ...)
258 {
259 va_list ap;
260
261 va_start(ap, format);
262 len = vsnprintf(buff, len, format, ap);
263 va_end(ap);
264
265 return len;
266 }