2 AcessOS Basic C Library
\r
6 #include <acess/sys.h>
\r
13 EXPORT int puts(const char *str);
\r
14 EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad);
\r
15 EXPORT int atoi(const char *str);
\r
16 EXPORT int puts(const char *str);
\r
17 EXPORT int ssprintfv(char *format, va_list args);
\r
18 EXPORT void sprintfv(char *buf, char *format, va_list args);
\r
19 EXPORT int printf(const char *format, ...);
\r
20 EXPORT int strlen(const char *str);
\r
21 EXPORT int strcmp(char *str1, char *str2);
\r
22 EXPORT int strncmp(char *str1, char *str2, size_t len);
\r
23 EXPORT char *strcpy(char *dst, const char *src);
\r
26 EXPORT int putchar(int ch)
\r
28 return write(_stdout, 1, (char*)&ch);
\r
31 EXPORT int puts(const char *str)
\r
38 len = write(_stdout, len, (char*)str);
\r
39 write(_stdout, 1, "\n");
\r
45 \fn EXPORT void sprintfv(char *buf, char *format, va_list args)
\r
46 \brief Prints a formatted string to a buffer
\r
47 \param buf Pointer - Destination Buffer
\r
48 \param format String - Format String
\r
49 \param args VarArgs List - Arguments
\r
51 EXPORT void sprintfv(char *buf, char *format, va_list args)
\r
54 int c, arg, minSize;
\r
61 while((c = *format++) != 0)
\r
63 //SysDebug("c = '%c'\n", c);
\r
82 if('1' <= c && c <= '9')
\r
84 while('0' <= c && c <= '9')
\r
95 arg = va_arg(args, int);
\r
104 itoa(tmp, arg, 10, minSize, pad);
\r
108 itoa(tmp, arg, 10, minSize, pad);
\r
112 itoa(tmp, arg, 16, minSize, pad);
\r
116 itoa(tmp, arg, 8, minSize, pad);
\r
120 itoa(tmp, arg, 2, minSize, pad);
\r
127 if(!p) p = "(null)";
\r
128 while(*p) buf[pos++] = *p++;
\r
140 - Size, Stream, Print Formated, Variable Argument List
\r
143 \fn EXPORT int ssprintfv(char *format, va_list args)
\r
144 \brief Gets the total character count from a formatted string
\r
145 \param format String - Format String
\r
146 \param args VarArgs - Argument List
\r
148 EXPORT int ssprintfv(char *format, va_list args)
\r
151 int c, arg, minSize;
\r
158 while((c = *format++) != 0)
\r
180 if('1' <= c && c <= '9')
\r
182 while('0' <= c && c <= '9')
\r
185 minSize += c - '0';
\r
191 arg = va_arg(args, int);
\r
199 itoa(tmp, arg, 10, minSize, pad);
\r
202 itoa(tmp, arg, 10, minSize, pad);
\r
205 itoa(tmp, arg, 16, minSize, pad);
\r
208 itoa(tmp, arg, 8, minSize, pad);
\r
212 itoa(tmp, arg, 2, minSize, pad);
\r
218 if(!p) p = "(null)";
\r
219 while(*p) len++, p++;
\r
230 const char cUCDIGITS[] = "0123456789ABCDEF";
\r
232 * \fn static void itoa(char *buf, unsigned long num, int base, int minLength, char pad)
\r
233 * \brief Convert an integer into a character string
\r
235 EXPORT void itoa(char *buf, unsigned long num, int base, int minLength, char pad)
\r
246 while(num > base-1) {
\r
247 tmpBuf[pos] = cUCDIGITS[ num % base ];
\r
248 num = (long) num / base; //Shift {number} right 1 digit
\r
252 tmpBuf[pos++] = cUCDIGITS[ num % base ]; //Last digit of {number}
\r
255 while(minLength-- > 0) buf[i++] = pad;
\r
256 while(pos-- > 0) buf[i++] = tmpBuf[pos]; //Reverse the order of characters
\r
262 EXPORT int atoi(const char *str)
\r
270 while(*str == ' ' || *str == '\t') str++;
\r
272 // Check for negative
\r
283 while( ('0' <= *str && *str <= '9')
\r
284 || ('A' <= *str && *str <= 'F' )
\r
285 || ('a' <= *str && *str <= 'f' )
\r
291 } else if (*str <= 'F') {
\r
292 ret += *str - 'A' + 10;
\r
294 ret += *str - 'a' + 10;
\r
300 while( '0' <= *str && *str <= '7' )
\r
309 while( '0' <= *str && *str <= '9' )
\r
317 // Negate if needed
\r
318 if(neg) ret = -ret;
\r
323 EXPORT int printf(const char *format, ...)
\r
329 va_start(args, format);
\r
330 size = ssprintfv((char*)format, args);
\r
333 buf = (char*)malloc(size+1);
\r
336 va_start(args, format);
\r
337 sprintfv(buf, (char*)format, args);
\r
341 write(_stdout, size+1, buf);
\r
347 EXPORT int sprintf(const char *buf, char *format, ...)
\r
350 va_start(args, format);
\r
351 sprintfv((char*)buf, (char*)format, args);
\r
358 EXPORT int strcmp(char *s1, char *s2)
\r
360 while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
\r
363 return (int)*s1 - (int)*s2;
\r
365 EXPORT char *strcpy(char *dst, const char *src)
\r
375 EXPORT int strlen(const char *str)
\r
378 for(retval = 0; *str != '\0'; str++)
\r
383 EXPORT int strncmp(char *s1, char *s2, size_t len)
\r
385 while(--len && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
\r
388 return (int)*s1 - (int)*s2;
\r
391 EXPORT void *memcpy(void *dest, void *src, unsigned int count)
\r
393 char *sp = (char *)src;
\r
394 char *dp = (char *)dest;
\r
395 for(;count--;) *dp++ = *sp++;
\r
399 EXPORT void *memmove(void *dest, void *src, unsigned int count)
\r
401 char *sp = (char *)src;
\r
402 char *dp = (char *)dest;
\r
403 // Check if corruption will happen
\r
404 if( (unsigned int)dest > (unsigned int)src && (unsigned int)dest < (unsigned int)src+count )
\r
405 for(;count--;) dp[count] = sp[count];
\r
407 for(;count--;) *dp++ = *sp++;
\r