string.c

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

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