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 ]

Diff markup

Differences between /sos/klibc.c (Article 5) and /sos/klibc.c (Article 4)


001 /* Copyright (C) 2004  David Decotigny (with I    001 /* Copyright (C) 2004  David Decotigny (with INSA Rennes for vsnprintf)
002    Copyright (C) 2003  The KOS Team               002    Copyright (C) 2003  The KOS Team
003    Copyright (C) 1999  Free Software Foundatio    003    Copyright (C) 1999  Free Software Foundation
004                                                   004 
005    This program is free software; you can redi    005    This program is free software; you can redistribute it and/or
006    modify it under the terms of the GNU Genera    006    modify it under the terms of the GNU General Public License
007    as published by the Free Software Foundatio    007    as published by the Free Software Foundation; either version 2
008    of the License, or (at your option) any lat    008    of the License, or (at your option) any later version.
009                                                   009    
010    This program is distributed in the hope tha    010    This program is distributed in the hope that it will be useful,
011    but WITHOUT ANY WARRANTY; without even the     011    but WITHOUT ANY WARRANTY; without even the implied warranty of
012    MERCHANTABILITY or FITNESS FOR A PARTICULAR    012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013    GNU General Public License for more details    013    GNU General Public License for more details.
014                                                   014    
015    You should have received a copy of the GNU     015    You should have received a copy of the GNU General Public License
016    along with this program; if not, write to t    016    along with this program; if not, write to the Free Software
017    Foundation, Inc., 59 Temple Place - Suite 3    017    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
018    USA.                                           018    USA. 
019 */                                                019 */
020 #include "klibc.h"                                020 #include "klibc.h"
021                                                   021 
022 /* For an optimized version, see BSD sources ;    022 /* For an optimized version, see BSD sources ;) */
023 void *memcpy(void *dst0, const void *src0, reg    023 void *memcpy(void *dst0, const void *src0, register unsigned int size)
024 {                                                 024 {
025   char *dst;                                      025   char *dst;
026   const char *src;                                026   const char *src;
027   for (dst = (char*)dst0, src = (const char*)s    027   for (dst = (char*)dst0, src = (const char*)src0 ;
028        size > 0 ;                                 028        size > 0 ;
029        dst++, src++, size--)                      029        dst++, src++, size--)
030     *dst = *src;                                  030     *dst = *src;
031   return dst0;                                    031   return dst0;
032 }                                                 032 }
033                                                   033 
034 /* ditto */                                       034 /* ditto */
035 void *memset(void *dst0, register int c, regis    035 void *memset(void *dst0, register int c, register unsigned int length)
036 {                                                 036 {
037   char *dst;                                      037   char *dst;
038   for (dst = (char*) dst0 ;                       038   for (dst = (char*) dst0 ;
039        length > 0 ;                               039        length > 0 ;
040        dst++, length --)                          040        dst++, length --)
041     *dst = (char)c;                               041     *dst = (char)c;
042   return dst0;                                    042   return dst0;
043 }                                                 043 }
044                                                   044 
045 int memcmp(const void *s1, const void *s2, sos    045 int memcmp(const void *s1, const void *s2, sos_size_t len)
046 {                                                 046 {
047   const unsigned char *c1, *c2;                   047   const unsigned char *c1, *c2;
048   unsigned int i;                                 048   unsigned int i;
049                                                   049  
050   for (i = 0, c1 = s1, c2 = s2; i < len; i++,     050   for (i = 0, c1 = s1, c2 = s2; i < len; i++, c1++, c2++)
051     {                                             051     {
052       if(*c1 != *c2)                              052       if(*c1 != *c2)
053         return *c1 - *c2;                         053         return *c1 - *c2;
054     }                                             054     }
055                                                   055  
056   return 0;                                       056   return 0;
057 }                                                 057 }
058                                                   058 
059                                                   059 
060 unsigned int strlen(register const char *str)     060 unsigned int strlen(register const char *str)
061 {                                                 061 {
062   unsigned int retval = 0;                        062   unsigned int retval = 0;
063                                                   063   
064   while (*str++)                                  064   while (*str++)
065     retval++;                                     065     retval++;
066                                                   066   
067   return retval;                                  067   return retval;
068 }                                                 068 }
069                                                   069 
070                                                   070 
071 unsigned int strnlen(const char * s, sos_size_    071 unsigned int strnlen(const char * s, sos_size_t count)
072 {                                                 072 {
073   const char *sc;                                 073   const char *sc;
074                                                   074   
075   for (sc = s; count-- && *sc != '\0'; ++sc)      075   for (sc = s; count-- && *sc != '\0'; ++sc)
076     /* nothing */continue;                        076     /* nothing */continue;
077                                                   077 
078   return sc - s;                                  078   return sc - s;
079 }                                                 079 }
080                                                   080 
081                                                   081 
082 char *strzcpy(register char *dst, register con    082 char *strzcpy(register char *dst, register const char *src, register int len)
083 {                                                 083 {
084   int i;                                          084   int i;
085                                                   085 
086   if (len <= 0)                                   086   if (len <= 0)
087     return dst;                                   087     return dst;
088                                                   088   
089   for (i = 0; i < len; i++)                       089   for (i = 0; i < len; i++)
090     {                                             090     {
091       dst[i] = src[i];                            091       dst[i] = src[i];
092       if(src[i] == '\0')                          092       if(src[i] == '\0')
093         return dst;                               093         return dst;
094     }                                             094     }
095                                                   095   
096   dst[len-1] = '\0';                              096   dst[len-1] = '\0'; 
097   return dst;                                     097   return dst;
098 }                                                 098 }
099                                                   099 
100                                                   100 
101 char *strzcat (char *dest, const char *src, so    101 char *strzcat (char *dest, const char *src, sos_size_t n)
102 {                                                 102 {
103   char *res = dest;                               103   char *res = dest;
104                                                   104   
105   for ( ; *dest ; dest++);                        105   for ( ; *dest ; dest++);
106                                                   106   
107   for ( ; *src ; src++, dest++) {                 107   for ( ; *src ; src++, dest++) {
108     *dest = *src;                                 108     *dest = *src;
109     n--;                                          109     n--;
110     if (n <= 0)                                   110     if (n <= 0)
111       break;                                      111       break;
112   }                                               112   }
113                                                   113 
114   *dest = '\0';                                   114   *dest = '\0';
115   return res;                                     115   return res;
116 }                                                 116 }
117                                                   117 
118 int strcmp(register const char *s1, register c    118 int strcmp(register const char *s1, register const char *s2)
119 {                                                 119 {
120   while (*s1 == *s2++)                            120   while (*s1 == *s2++)
121     if (*s1++ == 0)                               121     if (*s1++ == 0)
122       return (0);                                 122       return (0);
123                                                   123   
124   return (*(const unsigned char *)s1 - *(const    124   return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
125 }                                                 125 }
126                                                   126 
127                                                   127 
128 int strncmp(register const char *s1, register     128 int strncmp(register const char *s1, register const char *s2, register int len)
129 {                                                 129 {
130   char c1 = '\0', c2 = '\0';                      130   char c1 = '\0', c2 = '\0';
131                                                   131   
132   while (len > 0)                                 132   while (len > 0)
133     {                                             133     {
134       c1 = (unsigned char) *s1++;                 134       c1 = (unsigned char) *s1++;
135       c2 = (unsigned char) *s2++;                 135       c2 = (unsigned char) *s2++;
136       if (c1 == '\0' || c1 != c2)                 136       if (c1 == '\0' || c1 != c2)
137         return c1 - c2;                           137         return c1 - c2;
138       len--;                                      138       len--;
139     }                                             139     }
140                                                   140   
141   return c1 - c2;                                 141   return c1 - c2;
142 }                                                 142 }
143                                                   143 
144                                                   144 
145 /* I (d2) borrowed and rewrote this for Nachos    145 /* I (d2) borrowed and rewrote this for Nachos/INSA Rennes. Thanks to
146    them for having kindly allowed me to do so.    146    them for having kindly allowed me to do so. */
147 int vsnprintf(char *buff, sos_size_t len, cons    147 int vsnprintf(char *buff, sos_size_t len, const char * format, va_list ap)
148 {                                                 148 {
149   sos_size_t i, result;                           149   sos_size_t i, result;
150                                                   150   
151   if (!buff || !format || (len < 0))              151   if (!buff || !format || (len < 0))
152     return -1;                                    152     return -1;
153                                                   153   
154 #define PUTCHAR(thechar) \                        154 #define PUTCHAR(thechar) \
155   do { \                                          155   do { \
156     if (result < len-1) \                         156     if (result < len-1) \
157       *buff++ = (thechar);  \                     157       *buff++ = (thechar);  \
158     result++; \                                   158     result++; \
159   } while (0)                                     159   } while (0)
160                                                   160   
161   result = 0;                                     161   result = 0;
162   for(i=0 ; format[i] != '\0' ; i++){             162   for(i=0 ; format[i] != '\0' ; i++){
163     switch (format[i])                            163     switch (format[i])
164       {                                           164       {
165       case '%':                                   165       case '%':
166         i++;                                      166         i++;
167         switch(format[i])                         167         switch(format[i])
168           {                                       168           {
169           case '%':                               169           case '%':
170             {                                     170             {
171               PUTCHAR('%');                       171               PUTCHAR('%');
172               break;                              172               break;
173             }                                     173             }
174           case 'i':;                              174           case 'i':;
175           case 'd':                               175           case 'd':
176             {                                     176             {
177               int integer = va_arg(ap,int);       177               int integer = va_arg(ap,int);
178               int cpt2 = 0;                       178               int cpt2 = 0;
179               char buff_int[16];                  179               char buff_int[16];
180                                                   180               
181               if (integer<0)                      181               if (integer<0)
182                 PUTCHAR('-');                     182                 PUTCHAR('-');
183               /* Ne fait pas integer = -intege    183               /* Ne fait pas integer = -integer ici parce que INT_MIN
184                  n'a pas d'equivalent positif     184                  n'a pas d'equivalent positif (int = [-2^31, 2^31-1]) */
185                                                   185               
186               do {                                186               do {
187                 int m10 = integer%10;             187                 int m10 = integer%10;
188                 m10 = (m10 < 0)? -m10:m10;        188                 m10 = (m10 < 0)? -m10:m10;
189                 buff_int[cpt2++]=(char)('0'+ m    189                 buff_int[cpt2++]=(char)('0'+ m10);
190                 integer=integer/10;               190                 integer=integer/10;
191               } while(integer!=0);                191               } while(integer!=0);
192                                                   192               
193               for(cpt2 = cpt2 - 1 ; cpt2 >= 0     193               for(cpt2 = cpt2 - 1 ; cpt2 >= 0 ; cpt2--)
194                 PUTCHAR(buff_int[cpt2]);          194                 PUTCHAR(buff_int[cpt2]);
195                                                   195               
196               break;                              196               break;
197             }                                     197             }
198                                                   198             
199           case 'c':                               199           case 'c':
200             {                                     200             {
201               int value = va_arg(ap,int);         201               int value = va_arg(ap,int);
202               PUTCHAR((char)value);               202               PUTCHAR((char)value);
203               break;                              203               break;
204             }                                     204             }
205                                                   205             
206           case 's':                               206           case 's':
207             {                                     207             {
208               char *string = va_arg(ap,char *)    208               char *string = va_arg(ap,char *);
209               if (! string)                       209               if (! string)
210                 string = "(null)";                210                 string = "(null)";
211               for( ; *string != '\0' ; string+    211               for( ; *string != '\0' ; string++)
212                 PUTCHAR(*string);                 212                 PUTCHAR(*string);
213               break;                              213               break;
214             }                                     214             }
215                                                   215 
216           case 'x':                               216           case 'x':
217             {                                     217             {
218               unsigned int hexa = va_arg(ap,in    218               unsigned int hexa = va_arg(ap,int);
219               unsigned int nb;                    219               unsigned int nb;
220               int i, had_nonzero = 0;             220               int i, had_nonzero = 0;
221               for(i=0 ; i < 8 ; i++)              221               for(i=0 ; i < 8 ; i++)
222                 {                                 222                 {
223                   nb = (unsigned int)(hexa <<     223                   nb = (unsigned int)(hexa << (i*4));
224                   nb = (nb >> 28) & 0xf;          224                   nb = (nb >> 28) & 0xf;
225                   // Skip the leading zeros       225                   // Skip the leading zeros
226                   if (nb == 0)                    226                   if (nb == 0)
227                     {                             227                     {
228                       if (had_nonzero)            228                       if (had_nonzero)
229                         PUTCHAR('0');             229                         PUTCHAR('0');
230                     }                             230                     }
231                   else                            231                   else
232                     {                             232                     {
233                       had_nonzero = 1;            233                       had_nonzero = 1;
234                       if (nb < 10)                234                       if (nb < 10)
235                         PUTCHAR('0'+nb);          235                         PUTCHAR('0'+nb);
236                       else                        236                       else
237                         PUTCHAR('a'+(nb-10));     237                         PUTCHAR('a'+(nb-10));
238                     }                             238                     }
239                 }                                 239                 }
240               if (! had_nonzero)                  240               if (! had_nonzero)
241                 PUTCHAR('0');                     241                 PUTCHAR('0');
242               break;                              242               break;
243             }                                     243             }
244             break;                                244             break;
245                                                   245         
246           default:                                246           default:
247             PUTCHAR('%');                         247             PUTCHAR('%');
248             PUTCHAR(format[i]);                   248             PUTCHAR(format[i]);
249           }                                       249           }
250         break;                                    250         break;
251                                                   251         
252       default:                                    252       default:
253         PUTCHAR(format[i]);                       253         PUTCHAR(format[i]);
254       }                                           254       }
255   }                                               255   }
256                                                   256   
257   *buff = '\0';                                   257   *buff = '\0';
258   return result;                                  258   return result;
259 }                                                 259 }
260                                                   260 
261                                                   261 
262 int snprintf(char * buff, sos_size_t len, cons    262 int snprintf(char * buff, sos_size_t len, const char *format, ...)
263 {                                                 263 {
264   va_list ap;                                     264   va_list ap;
265                                                   265  
266   va_start(ap, format);                           266   va_start(ap, format);
267   len = vsnprintf(buff, len, format, ap);         267   len = vsnprintf(buff, len, format, ap);
268   va_end(ap);                                     268   va_end(ap);
269                                                   269  
270   return len;                                     270   return len;
271 }                                                 271 }
                                                      

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