SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2004  David Decotigny (with INSA Rennes for vsnprintf)
002    Copyright (C) 2003  The KOS Team
003    Copyright (C) 1999  Free Software Foundation
004 
005    This program is free software; you can redistribute it and/or
006    modify it under the terms of the GNU General Public License
007    as published by the Free Software Foundation; either version 2
008    of the License, or (at your option) any later version.
009    
010    This program is distributed in the hope that it will be useful,
011    but WITHOUT ANY WARRANTY; without even the implied warranty of
012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013    GNU General Public License for more details.
014    
015    You should have received a copy of the GNU General Public License
016    along with this program; if not, write to the Free Software
017    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
018    USA. 
019 */
020 #include "klibc.h"
021 
022 /* For an optimized version, see BSD sources ;) */
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 /* ditto */
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     /* nothing */;
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 /* I (d2) borrowed and rewrote this for Nachos/INSA Rennes. Thanks to
141    them for having kindly allowed me to do so. */
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               /* Ne fait pas integer = -integer ici parce que INT_MIN
179                  n'a pas d'equivalent positif (int = [-2^31, 2^31-1]) */
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                   // Skip the leading zeros
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 }

source navigation ] diff markup ] identifier search ] general search ]