/*------------------------------------------------------* | Author: Maurizio Loreti, aka MLO or (HAM) I3NOO | | Work: University of Padova - Department of Physics | | Via F. Marzolo, 8 - 35131 PADOVA - Italy | | Phone: +39 (049) 827-7216 FAX: +39 (049) 827-7102 | | EMail: loreti@padova.infn.it | | WWW: http://wwwcdf.pd.infn.it/~loreti/mlo.html | *------------------------------------------------------* The five procedures i_strchr, i_strrchr, i_strstr, i_strcmp and i_strncmp behave exactly as their counterparts (without the leading i_) as defined in ; but the comparison is case insensitive. l_strlcpy and l_strlcat behave as strcpy and strcat, but the copied string is converted to lowercase. Compile with -DTEST to have a (quick and dirty) test program. *------------------------------------------------------*/ #include /* tolower */ #include /* size_t */ #ifdef TEST #include #include #define BUFFER_LENGTH 128 #endif /* TEST */ /** | Prototypes **/ char *i_strchr(const char *, const int); char *i_strrchr(const char *, const int); char *i_strstr(const char *, const char *); int i_strcmp(const char *, const char *); int i_strncmp(const char *, const char *, size_t); char *l_strcpy(char *, const char *); char *l_strcat(char *, const char *); char *i_strchr( const char *s, const int c ) { register int sc; register int cc; for (cc = tolower((unsigned char) c); (sc = tolower((unsigned char) *s)) != 0; s++) { if (sc == cc) return ((char *) s); } return 0; } char *i_strrchr( const char *s, const int c ) { register int sc; register int cc; register const char *pc = 0; for (cc = tolower((unsigned char) c); (sc = tolower((unsigned char) *s)) != 0; s++) { if (sc == cc) pc = s; } return ((char *) pc); } char *i_strstr( const char *s1, const char *s2 ) { register char sc1; register char sc2; if ((sc2 = tolower((unsigned char) *s2)) == '\0') return ((char *) s1); for ( ; (sc1 = tolower((unsigned char) *s1)) != '\0'; s1++) { if (sc1 == sc2) { register const char *p1 = s1; register const char *p2 = s2; while (1) { if (*++p2 == '\0') { return ((char *) s1); } else { if (tolower((unsigned char) *++p1) != tolower((unsigned char) *p2)) break; } } } } return 0; } int i_strcmp( const char *s1, const char *s2 ){ while (1) { register int i; i = tolower((unsigned char) *s1) - tolower((unsigned char) *s2); if (i || *s2 == '\0') return i; s1++; s2++; } return 0; } int i_strncmp( const char *s1, const char *s2, size_t n ){ for ( ; n--; s1++, s2++) { register int i; i = tolower((unsigned char) *s1) - tolower((unsigned char) *s2); if (i || *s2 == '\0') return i; } return 0; } char *l_strcpy( char *to, const char *from ) { register const char *pc = from; while ((*to++ = tolower((unsigned char) *pc)) != 0) pc++; return ((char *) from); } char *l_strcat( char *to, const char *from ) { register const char *pc = from; while (*to != '\0') to++; while ((*to++ = tolower((unsigned char) *pc)) != '\0') pc++; return ((char *) from); } #ifdef TEST int main() { char buffer[BUFFER_LENGTH], string[BUFFER_LENGTH]; char *pc; puts("Testing strchr..."); for (;;) { char c; printf("String (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; strcpy(string, buffer); printf("Char ? "); fgets(buffer, BUFFER_LENGTH, stdin); c = buffer[0]; if ((pc = i_strchr(string, c)) == 0) { puts("No match."); } else { size_t pos = pc - string; printf("Match at string[%u]\n", pos); } } puts("Testing strrchr..."); for (;;) { char c; printf("String (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; strcpy(string, buffer); printf("Char ? "); fgets(buffer, BUFFER_LENGTH, stdin); c = buffer[0]; if ((pc = i_strrchr(string, c)) == 0) { puts("No match."); } else { size_t pos = pc - string; printf("Match at string[%u]\n", pos); } } puts("Testing strstr..."); for (;;) { printf("String (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; strcpy(string, buffer); printf("Substring ? "); fgets(buffer, BUFFER_LENGTH, stdin); if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; if ((pc = i_strstr(string, buffer)) == 0) { puts("No match."); } else { size_t pos = pc - string; printf("Match at string[%u]\n", pos); } } puts("Testing strcmp..."); for (;;) { int i; printf("String 1 (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; strcpy(string, buffer); printf("String 2 ? "); fgets(buffer, BUFFER_LENGTH, stdin); if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; if ((i = i_strcmp(string, buffer)) == 0) { puts("String 1 == String 2"); } else if (i < 0) { puts("String 1 < String 2"); } else { puts("String 1 > String 2"); } } puts("Testing strncmp..."); for (;;) { int i; size_t n; char input[BUFFER_LENGTH]; printf("String 1 (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; strcpy(string, buffer); printf("String 2 ? "); fgets(buffer, BUFFER_LENGTH, stdin); if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; printf("N ? "); fgets(input, BUFFER_LENGTH, stdin); if ((pc = strrchr(input, '\n')) != 0) *pc = '\0'; n = strtoul(input, 0, 10); if ((i = i_strncmp(string, buffer, n)) == 0) { puts("String 1 == String 2"); } else if (i < 0) { puts("String 1 < String 2"); } else { puts("String 1 > String 2"); } } puts("Testing strcpy..."); for (;;) { printf("String (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; l_strcpy(string, buffer); printf("Destination: \"%s\"\n", string); } puts("Testing strcat..."); for (;;) { printf("Original string (\\ to exit) ? "); fgets(buffer, BUFFER_LENGTH, stdin); if (buffer[0] == '\\') break; if ((pc = strrchr(buffer, '\n')) != 0) *pc = '\0'; printf("String to be appended ? "); fgets(string, BUFFER_LENGTH, stdin); if ((pc = strrchr(string, '\n')) != 0) *pc = '\0'; l_strcat(buffer, string); printf("Result: \"%s\"\n", buffer); } return 0; } #endif /* TEST */