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 2) and /sos/klibc.c (Article 6)


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 */;                             !! 076     /* nothing */continue;
                                                   >> 077 
077   return sc - s;                                  078   return sc - s;
078 }                                                 079 }
079                                                   080 
080                                                   081 
081 char *strzcpy(register char *dst, register con    082 char *strzcpy(register char *dst, register const char *src, register int len)
082 {                                                 083 {
083   int i;                                          084   int i;
                                                   >> 085 
                                                   >> 086   if (len <= 0)
                                                   >> 087     return dst;
084                                                   088   
085   for (i = 0; i < len; i++)                       089   for (i = 0; i < len; i++)
086     {                                             090     {
087       dst[i] = src[i];                            091       dst[i] = src[i];
088       if(src[i] == '\0')                          092       if(src[i] == '\0')
089         return dst;                               093         return dst;
090     }                                             094     }
091                                                   095   
092   dst[len-1] = '\0';                              096   dst[len-1] = '\0'; 
093   return dst;                                     097   return dst;
094 }                                                 098 }
095                                                   099 
                                                   >> 100 
096 char *strzcat (char *dest, const char *src, so    101 char *strzcat (char *dest, const char *src, sos_size_t n)
097 {                                                 102 {
098   char *res = dest;                               103   char *res = dest;
099                                                   104   
100   for ( ; *dest ; dest++);                        105   for ( ; *dest ; dest++);
101                                                   106   
102   for ( ; *src ; src++, dest++) {                 107   for ( ; *src ; src++, dest++) {
103     *dest = *src;                                 108     *dest = *src;
104     n--;                                          109     n--;
105     if (n <= 0)                                   110     if (n <= 0)
106       break;                                      111       break;
107   }                                               112   }
108                                                   113 
109   *dest = '\0';                                   114   *dest = '\0';
110   return res;                                     115   return res;
111 }                                                 116 }
112                                                   117 
113 int strcmp(register const char *s1, register c    118 int strcmp(register const char *s1, register const char *s2)
114 {                                                 119 {
115   while (*s1 == *s2++)                            120   while (*s1 == *s2++)
116     if (*s1++ == 0)                               121     if (*s1++ == 0)
117       return (0);                                 122       return (0);
118                                                   123   
119   return (*(const unsigned char *)s1 - *(const    124   return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 - 1));
120 }                                                 125 }
121                                                   126 
122                                                   127 
123 int strncmp(register const char *s1, register     128 int strncmp(register const char *s1, register const char *s2, register int len)
124 {                                                 129 {
125   char c1 = '\0', c2 = '\0';                      130   char c1 = '\0', c2 = '\0';
126                                                   131   
127   while (len > 0)                                 132   while (len > 0)
128     {                                             133     {
129       c1 = (unsigned char) *s1++;                 134       c1 = (unsigned char) *s1++;
130       c2 = (unsigned char) *s2++;                 135       c2 = (unsigned char) *s2++;
131       if (c1 == '\0' || c1 != c2)                 136       if (c1 == '\0' || c1 != c2)
132         return c1 - c2;                           137         return c1 - c2;
133       len--;                                      138       len--;
134     }                                             139     }
135                                                   140   
136   return c1 - c2;                                 141   return c1 - c2;
137 }                                                 142 }
138                                                   143 
139                                                   144 
                                                   >> 145 static unsigned long int _random_seed = 93186752;
                                                   >> 146 
                                                   >> 147 /**
                                                   >> 148  * The following code is borrowed from Glenn Rhoads.
                                                   >> 149  * http://remus.rutgers.edu/~rhoads/Code/code.html
                                                   >> 150  * License to be defined...
                                                   >> 151  */
                                                   >> 152 unsigned long int random (void)
                                                   >> 153 {
                                                   >> 154 /* The following parameters are recommended settings based on research
                                                   >> 155    uncomment the one you want. */
                                                   >> 156 
                                                   >> 157 /* For RAND_MAX == 4294967291 */
                                                   >> 158    static unsigned int a = 1588635695, q = 2, r = 1117695901;
                                                   >> 159 /* static unsigned int a = 1223106847, m = 4294967291U, q = 3, r = 625646750;*/
                                                   >> 160 /* static unsigned int a = 279470273, m = 4294967291U, q = 15, r = 102913196;*/
                                                   >> 161 
                                                   >> 162 /* For RAND_MAX == 2147483647 */
                                                   >> 163 /* static unsigned int a = 1583458089, m = 2147483647, q = 1, r = 564025558; */
                                                   >> 164 /* static unsigned int a = 784588716, m = 2147483647, q = 2, r = 578306215;  */
                                                   >> 165 /* static unsigned int a = 16807, m = 2147483647, q = 127773, r = 2836;      */
                                                   >> 166 /* static unsigned int a = 950706376, m = 2147483647, q = 2, r = 246070895;  */
                                                   >> 167 
                                                   >> 168    _random_seed = a*(_random_seed % q) - r*(_random_seed / q);
                                                   >> 169    return _random_seed;
                                                   >> 170 }
                                                   >> 171 
                                                   >> 172 
                                                   >> 173 void srandom (unsigned long int seed)
                                                   >> 174 {
                                                   >> 175   _random_seed = seed;
                                                   >> 176 }
                                                   >> 177 
                                                   >> 178 
140 /* I (d2) borrowed and rewrote this for Nachos    179 /* I (d2) borrowed and rewrote this for Nachos/INSA Rennes. Thanks to
141    them for having kindly allowed me to do so.    180    them for having kindly allowed me to do so. */
142 int vsnprintf(char *buff, sos_size_t len, cons    181 int vsnprintf(char *buff, sos_size_t len, const char * format, va_list ap)
143 {                                                 182 {
144   sos_size_t i, result;                           183   sos_size_t i, result;
145                                                   184   
146   if (!buff || !format || (len < 0))              185   if (!buff || !format || (len < 0))
147     return -1;                                    186     return -1;
148                                                   187   
149 #define PUTCHAR(thechar) \                        188 #define PUTCHAR(thechar) \
150   do { \                                          189   do { \
151     if (result < len-1) \                         190     if (result < len-1) \
152       *buff++ = (thechar);  \                     191       *buff++ = (thechar);  \
153     result++; \                                   192     result++; \
154   } while (0)                                     193   } while (0)
155                                                   194   
156   result = 0;                                     195   result = 0;
157   for(i=0 ; format[i] != '\0' ; i++){             196   for(i=0 ; format[i] != '\0' ; i++){
158     switch (format[i])                            197     switch (format[i])
159       {                                           198       {
160       case '%':                                   199       case '%':
161         i++;                                      200         i++;
162         switch(format[i])                         201         switch(format[i])
163           {                                       202           {
164           case '%':                               203           case '%':
165             {                                     204             {
166               PUTCHAR('%');                       205               PUTCHAR('%');
167               break;                              206               break;
168             }                                     207             }
169           case 'i':;                              208           case 'i':;
170           case 'd':                               209           case 'd':
171             {                                     210             {
172               int integer = va_arg(ap,int);       211               int integer = va_arg(ap,int);
173               int cpt2 = 0;                       212               int cpt2 = 0;
174               char buff_int[16];                  213               char buff_int[16];
175                                                   214               
176               if (integer<0)                      215               if (integer<0)
177                 PUTCHAR('-');                     216                 PUTCHAR('-');
178               /* Ne fait pas integer = -intege    217               /* Ne fait pas integer = -integer ici parce que INT_MIN
179                  n'a pas d'equivalent positif     218                  n'a pas d'equivalent positif (int = [-2^31, 2^31-1]) */
180                                                   219               
181               do {                                220               do {
182                 int m10 = integer%10;             221                 int m10 = integer%10;
183                 m10 = (m10 < 0)? -m10:m10;        222                 m10 = (m10 < 0)? -m10:m10;
184                 buff_int[cpt2++]=(char)('0'+ m    223                 buff_int[cpt2++]=(char)('0'+ m10);
185                 integer=integer/10;               224                 integer=integer/10;
186               } while(integer!=0);                225               } while(integer!=0);
187                                                   226               
188               for(cpt2 = cpt2 - 1 ; cpt2 >= 0     227               for(cpt2 = cpt2 - 1 ; cpt2 >= 0 ; cpt2--)
189                 PUTCHAR(buff_int[cpt2]);          228                 PUTCHAR(buff_int[cpt2]);
190                                                   229               
191               break;                              230               break;
192             }                                     231             }
193                                                   232             
194           case 'c':                               233           case 'c':
195             {                                     234             {
196               int value = va_arg(ap,int);         235               int value = va_arg(ap,int);
197               PUTCHAR((char)value);               236               PUTCHAR((char)value);
198               break;                              237               break;
199             }                                     238             }
200                                                   239             
201           case 's':                               240           case 's':
202             {                                     241             {
203               char *string = va_arg(ap,char *)    242               char *string = va_arg(ap,char *);
204               if (! string)                       243               if (! string)
205                 string = "(null)";                244                 string = "(null)";
206               for( ; *string != '\0' ; string+    245               for( ; *string != '\0' ; string++)
207                 PUTCHAR(*string);                 246                 PUTCHAR(*string);
208               break;                              247               break;
209             }                                     248             }
210                                                   249 
                                                   >> 250           case 'p':
                                                   >> 251             PUTCHAR('0');
                                                   >> 252             PUTCHAR('x');
211           case 'x':                               253           case 'x':
212             {                                     254             {
213               unsigned int hexa = va_arg(ap,in    255               unsigned int hexa = va_arg(ap,int);
214               unsigned int nb;                    256               unsigned int nb;
215               int i, had_nonzero = 0;             257               int i, had_nonzero = 0;
216               for(i=0 ; i < 8 ; i++)              258               for(i=0 ; i < 8 ; i++)
217                 {                                 259                 {
218                   nb = (unsigned int)(hexa <<     260                   nb = (unsigned int)(hexa << (i*4));
219                   nb = (nb >> 28) & 0xf;          261                   nb = (nb >> 28) & 0xf;
220                   // Skip the leading zeros       262                   // Skip the leading zeros
221                   if (nb == 0)                    263                   if (nb == 0)
222                     {                             264                     {
223                       if (had_nonzero)            265                       if (had_nonzero)
224                         PUTCHAR('0');             266                         PUTCHAR('0');
225                     }                             267                     }
226                   else                            268                   else
227                     {                             269                     {
228                       had_nonzero = 1;            270                       had_nonzero = 1;
229                       if (nb < 10)                271                       if (nb < 10)
230                         PUTCHAR('0'+nb);          272                         PUTCHAR('0'+nb);
231                       else                        273                       else
232                         PUTCHAR('a'+(nb-10));     274                         PUTCHAR('a'+(nb-10));
233                     }                             275                     }
234                 }                                 276                 }
235               if (! had_nonzero)                  277               if (! had_nonzero)
236                 PUTCHAR('0');                     278                 PUTCHAR('0');
237               break;                              279               break;
238             }                                     280             }
239             break;                                281             break;
240                                                   282         
241           default:                                283           default:
242             PUTCHAR('%');                         284             PUTCHAR('%');
243             PUTCHAR(format[i]);                   285             PUTCHAR(format[i]);
244           }                                       286           }
245         break;                                    287         break;
246                                                   288         
247       default:                                    289       default:
248         PUTCHAR(format[i]);                       290         PUTCHAR(format[i]);
249       }                                           291       }
250   }                                               292   }
251                                                   293   
252   *buff = '\0';                                   294   *buff = '\0';
253   return result;                                  295   return result;
254 }                                                 296 }
255                                                   297 
256                                                   298 
257 int snprintf(char * buff, sos_size_t len, cons    299 int snprintf(char * buff, sos_size_t len, const char *format, ...)
258 {                                                 300 {
259   va_list ap;                                     301   va_list ap;
260                                                   302  
261   va_start(ap, format);                           303   va_start(ap, format);
262   len = vsnprintf(buff, len, format, ap);         304   len = vsnprintf(buff, len, format, ap);
263   va_end(ap);                                     305   va_end(ap);
264                                                   306  
265   return len;                                     307   return len;
266 }                                                 308 }
                                                      

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