initial commit
[pfinal.git] / Routix / src / string.c
blob14671546f0eedfcaa3d03e9e819c3e878c730e68
1 /* string.c */
3 #include "routix/system.h"
4 #include "string.h"
6 int strcmp(const char *s1, const char *s2)
8 int i;
9 int retorno=-1;
11 for ( i=0; (*s1 == *s2); i++, s1++, s2++) {
12 if ( ( *s1 == '\0' ) | ( *s1 == '\n' ) ) {
13 retorno=0;
14 break;
18 return retorno;
22 size_t strlen(const char *s)
24 size_t cantidad = 0;
26 for ( cantidad=0; *(s+cantidad) ; cantidad++) ;
28 return cantidad;
31 char *strcpy (char *dest, const char *src)
33 while ( *src) {
34 *dest++=*src++;
36 *dest='\0';
37 return dest;
40 char *strncpy (char *dest, const char *src, size_t nbytes)
42 while ( *src && nbytes) {
43 *dest++=*src++;
44 nbytes--;
46 *dest='\0';
47 return dest;
51 char *str_to_upper (char *str)
53 char *str_ret = str;
55 for ( ; *str ; str++)
56 *str = (char) toupper(*str);
57 return str_ret;
60 char *str_to_lower (char *str)
62 char *str_ret = str;
64 for ( ; *str ; str++)
65 *str = (char) tolower(*str);
66 return str_ret;
70 int tolower(int c)
72 if ( (c >= 'A') && (c <= 'Z') )
73 c+=32;
74 return c;
77 int toupper(int c)
79 if ( (c >= 'a') && (c <= 'z') )
80 c-=32;
81 return c;
85 int memcmp( const void *s1, const void *s2, dword n)
87 byte *s22 = (byte *) s2;
88 byte *s11 = (byte *) s1;
90 while (n--) {
91 if ( *s11 != *s22 )
92 return (int) (s11-s22);
93 s22++;s11++;
96 return 0;
100 void memcpy( void *dest, const void *src, dword n)
102 byte *dest1 = (char *)dest;
103 byte *src1 = (char *)src;
105 while (n--)
106 *dest1++ = *src1++;
108 return dest;
112 // Decidi escribir esta funcion de este modo al ver que el tiempo de ejecucion era entre 2 y 10 veces menor que
113 // el clasico codigo en C, sin sacrificar ningun tipo de comprobaciones. Influye tambien que esta funcion puede ser
114 // usada, entre otras cosas, para copiar paginas completas como ser el caso del directorio de paginas el cual sera
115 // duplicado por cada nueva tarea creada.
117 void *memcpy( void *dest, const void *src, dword n)
119 __asm__("push %%ecx; push %%edi ; push %%esi ;cld ; rep ; movsb ; pop %%esi ; pop %%edi ; pop %%ecx" \
120 : : "c" ((word) n), "S" (src), "D" (dest));
122 return dest;
125 void *memset(void *dest, int c, size_t n)
127 size_t i;
128 char *dst = (char *) dest;
129 for (i=0 ; i<n ; i++)
130 dst[i] = c;
131 return dest;