string.c

Go to the documentation of this file.
00001 /* string.c */
00002 
00003 #include <sys/types.h>
00004 #include <lib/routix.h>
00005 #include <string.h>
00006 
00007 int strcmp(const char *s1, const char *s2)
00008 {
00009  int i;
00010  int retorno=-1;
00011 
00012  for ( i=0; (*s1 == *s2); i++, s1++, s2++) {
00013   if ( ( *s1 == '\0' ) | ( *s1 == '\n' ) ) {
00014    retorno=0;
00015    break;
00016   }
00017  }
00018 
00019  return retorno;
00020 }
00021 
00022 
00023 size_t strlen(const char *s)
00024 {
00025  size_t cantidad = 0;
00026  
00027  for ( cantidad=0; *(s+cantidad) ; cantidad++) ;
00028 
00029  return cantidad;
00030 }
00031 
00032 char *strcat(char *dest, char *src) 
00033 {
00034     char *dest_aux = dest + strlen(dest);
00035 
00036     while (*src) 
00037         *dest_aux++ = *src++;
00038 
00039     return dest;
00040 }       
00041 
00042 
00043 char *strcpy (char *dest, const char *src) 
00044 {
00045     while ( *src) {
00046         *dest++=*src++;
00047     }
00048     *dest='\0';
00049     return dest;
00050 }
00051 
00052 char *strncpy (char *dest, const char *src, size_t nbytes) 
00053 {
00054     while ( *src && nbytes) {
00055         *dest++=*src++;
00056         nbytes--;
00057     }
00058     *dest='\0';
00059     return dest;
00060 }
00061 
00062 
00064 // Convierte un string a mayusculas
00066 char *str_to_upper (char *str)
00067 {
00068     char *str_ret = str;
00069     while ( *str ) {
00070         if ( (*str >= 'a') && (*str <= 'z') )
00071             *str-=32;
00072     
00073         str++;
00074     }
00075     return str_ret;
00076 }       
00077 
00078 int memcmp( const void *s1, const void *s2, dword n)
00079 {
00080     byte *s22 = (byte *) s2;
00081     byte *s11 = (byte *) s1;
00082         
00083     while (n--) {
00084         if (   *s11 != *s22 )
00085             return (int) (s11-s22);
00086         s22++;s11++;
00087     }
00088             
00089     return 0;
00090 }       
00091 
00092 /*
00093 void memcpy( void *dest, const void *src, dword n)
00094 {
00095     byte *dest1 = (char *)dest;
00096     byte *src1 = (char *)src;
00097 
00098     while (n--)
00099         *dest1++ = *src1++;
00100         
00101     return dest;
00102 }       
00103 */
00104 
00105 // Decidi escribir esta funcion de este modo al ver que el tiempo de ejecucion era entre 2 y 10 veces menor que
00106 // el clasico codigo en C, sin sacrificar ningun tipo de comprobaciones. Influye tambien que esta funcion puede ser
00107 // usada, entre otras cosas, para copiar paginas completas como ser el caso del directorio de paginas el cual sera
00108 // duplicado por cada nueva tarea creada.
00109 
00110 void *memcpy( void *dest, const void *src, dword n)
00111 {
00112     __asm__("push %%ecx; push %%edi ; push %%esi ;cld ; rep ; movsb ; pop %%esi ; pop %%edi ; pop %%ecx" \
00113                     :  : "c" ((word) n), "S" (src), "D" (dest));
00114     
00115     return dest;
00116 }
00117 
00118 
00119 /* Ascii to Integer
00120  * "1943" => 1 * 10^3 + 9 * 10^2 + 4 * 10^1 + 3 * 10^0
00121  */
00122  
00123 
00124 int atoi(const char *str)
00125 {
00126  int numero = 0;
00127  int multiplicador = 1;
00128 
00129  size_t largo;
00130  for (largo = strlen(str) - 1  ; largo > -1  ;  largo--, multiplicador *= 10) {
00131   numero += ( *(str+largo) - '0' ) * multiplicador;
00132  }
00133  return numero;
00134 }
00135 

Generated on Sun May 30 18:38:35 2004 for Routix OS by doxygen 1.3.6