tholm@uvicctr.UUCP (Terrence W. Holm) (08/26/88)
EFTH MINIX report #29 - August 1988 - string(3) There follows an implementation of strchr(3), strrchr(3), strspn(3), strcspn(3), strpbrk(3), strstr(3) and strtok(3) for Minix. Please consider this public domain software. An #include file and "man" pages are included. Note: Henry Spencer has also written a very good set of public domain string(3) routines. You may choose to use his instead. ---------------------------------------------------------- echo x - strcat.3 gres '^X' '' > strcat.3 << '/' XSUBROUTINES X strcat(3) - append a string onto another string X XINVOCATION X #include <string.h> X X char *strcat( to, from ) X char *to; X char *from; X X char *strncat( to, from, count ) X char *to; X char *from; X int count; X XEXPLANATION X The string pointed to by <from> is appended onto the end of the X string pointed to by <to>. Strncat(3) will copy no more than X <count> characters. X XRESULTS X <to>. / echo x - strchr.3 gres '^X' '' > strchr.3 << '/' XSUBROUTINES X strchr(3) - find a character in a string X XINVOCATION X #include <string.h> X X char *strchr( string, chr ) X char *string; X int chr; X X char *strrchr( string, chr ) X char *string; X int chr; X X char *index( string, chr ) X char *string; X char chr; X X char *rindex( string, chr ) X char *string; X char chr; X XEXPLANATION X These functions search for a character <chr> in the string X pointed to by <string>. Strchr(3) starts at the beginning of X the string and strrchr(3) searches backwards from the end of X the string. X X Index(3) is the same as strchr(3). Rindex(3) is the same X as strrchr(3) X XRESULTS X A pointer to the character within the string, if found, X otherwise returns NULL. / echo x - strchr.c gres '^X' '' > strchr.c << '/' X/* strchr(3) X * X * Derived from MINIX index(3) X */ X X X#define NULL (char *) 0 X X Xchar *strchr( string, chr ) X register char *string; X register char chr; X X { X do { X if ( *string == chr ) X return( string ); X } while ( *string++ != '\0' ); X X return( NULL ); X } / echo x - strcmp.3 gres '^X' '' > strcmp.3 << '/' XSUBROUTINES X strcmp(3) - compare two strings X XINVOCATION X #include <string.h> X X int strcmp( string1, string2 ) X char *string1; X char *string2; X X int strncmp( string1, string2, size ) X char *string1; X char *string2; X int size; X XEXPLANATION X The string pointed to by <string1> is compared to the string X pointed to by <string2>. The comparison is based on the X ordering of ASCII characters. Strncmp(3) compares up to <count> X characters. X XRESULTS X <0 : string1 is less than string2 X =0 : string1 is equal to string2 X >0 : string1 is greater than string2 / echo x - strcpy.3 gres '^X' '' > strcpy.3 << '/' XSUBROUTINES X strcpy(3) - copy a string X XINVOCATION X #include <string.h> X X char *strcpy( to, from ) X char *to; X char *from; X X char *strncpy( to, from, count ) X char *to; X char *from; X int count; X XEXPLANATION X The string pointed to by <from> is copied to the storage pointed X to by <to>. Strncpy(3) will copy <count> characters, if <from> X was too short then the result will be padded with '\0's, if X <from> is too long then the result will not have a final '\0'. X XRESULTS X <to>. / echo x - strcspn.c gres '^X' '' > strcspn.c << '/' X/* strcspn(3) X * X * Author: Terrence W. Holm July 1988 X * X * X * This function determines the length of a span from the X * beginning of <string> which contains none of the X * characters specified in <char_set>. The length of the X * span is returned. X */ X X#define NULL (char *) 0 X X Xint strcspn( string, char_set ) X char *string; X char *char_set; X X { X register char *str; X register char *chr; X X if ( string == NULL ) X return( 0 ); X X if ( char_set == NULL ) X return( strlen(string) ); X X for ( str = string; *str != '\0'; ++str ) X for ( chr = char_set; *chr != '\0'; ++chr ) X if ( *str == *chr ) X return( str - string ); X X return( str - string ); X } / echo x - string.h gres '^X' '' > string.h << '/' X/* string.h (a.k.a. strings.h) */ X Xint strlen(); Xint strcmp(), strncmp(); Xint strspn(), strcspn(); X Xchar *strcpy(), *strncpy(); Xchar *strcat(), *strncat(); Xchar *index(), *rindex(); Xchar *strchr(), *strrchr(); Xchar *strpbrk(); Xchar *strtok(); Xchar *strstr(); / echo x - strlen.3 gres '^X' '' > strlen.3 << '/' XSUBROUTINES X strlen(3) - find the length of a string X XINVOCATION X #include <string.h> X X int strlen( string ) X char *strlen; X XRESULTS X The size of the string pointed to by <string>. Note that the X final '\0' is not counted. / echo x - strpbrk.3 gres '^X' '' > strpbrk.3 << '/' XSUBROUTINES X strpbrk(3) - find one of a set of characters a string X XINVOCATION X #include <string.h> X X char *strpbrk( string, char_set ) X char *string; X char *char_set; X XEXPLANATION X Strpbrk(3) scans <string> for the first occurrence of a character X from the string <char_set>. X XRESULTS X If a character from the <char_set> was found then a pointer to it X within <string> is returned, otherwise NULL is returned. X XREFERENCES X strspn(3) / echo x - strpbrk.c gres '^X' '' > strpbrk.c << '/' X/* strpbrk(3) X * X * Author: Terrence W. Holm July 1988 X * X * X * Strpbrk(3) scans <string> for the first occurrence of a X * character from the string <char_set>. If a character from X * the <char_set> was found then a pointer to it within X * <string> is returned, otherwise NULL is returned. X */ X X#define NULL (char *) 0 X X Xchar *strpbrk( string, char_set ) X char *string; X char *char_set; X X { X register char c; X register char *p; X X if ( string == NULL || char_set == NULL ) X return( NULL ); X X while ( (c = *string++) != '\0' ) X for ( p = char_set; *p != '\0'; ++p ) X if ( c == *p ) X return( string - 1 ); X X return( NULL ); X } / echo x - strrchr.c gres '^X' '' > strrchr.c << '/' X/* strrchr(3) X * X * Derived from MINIX rindex(3) X */ X X X#define NULL (char *) 0 X X Xchar *strrchr( string, chr ) X register char *string; X register char chr; X X { X char *index = NULL; X X do { X if ( *string == chr ) X index = string; X } while ( *string++ != '\0' ); X X return( index ); X } / echo x - strspn.3 gres '^X' '' > strspn.3 << '/' XSUBROUTINES X strspn(3) - look for a span of a set of characters in a string X XINVOCATION X #include <string.h> X X int strspn( string, char_set ) X char *string; X char *char_set; X X int strcspn( string, char_set ) X char *string; X char *char_set; X XEXPLANATION X These functions are used to determine the length of a span of X characters at the beginning of <string>. Strspn(3) finds a span X containing only characters specified in <char_set>. Strcspn(3) X finds the span containing no characters from <char_set>. X XRESULTS X The length of the span. X XREFERENCES X strpbrk(3) / echo x - strspn.c gres '^X' '' > strspn.c << '/' X/* strspn(3) X * X * Author: Terrence W. Holm July 1988 X * X * X * This function determines the length of a span from the X * beginning of <string> which contains only characters X * specified in <char_set>. The length of the span is X * returned. X */ X X#define NULL (char *) 0 X X Xint strspn( string, char_set ) X char *string; X char *char_set; X X { X register char *str; X register char *chr; X X if ( string == NULL || char_set == NULL ) X return( 0 ); X X for ( str = string; *str != '\0'; ++str ) X { X for ( chr = char_set; *chr != '\0'; ++chr ) X if ( *str == *chr ) X break; X X if ( *chr == '\0' ) X return( str - string ); X } X X return( str - string ); X } / echo x - strstr.3 gres '^X' '' > strstr.3 << '/' XSUBROUTINES X strstr(3) - find a substring in a string X XINVOCATION X #include <string.h> X X char *strstr( string, substr ) X char *string; X char *substr; X XEXPLANATION X Finds the first occurrence of a substring, pointed to by X <substr>, within a string pointed to by <string>. X XRESULTS X If the substring is found then a pointer to it within X <string> is returned, otherwise NULL is returned. / echo x - strstr.c gres '^X' '' > strstr.c << '/' X/* strstr(3) X * X * Author: Terrence W. Holm July 1988 X * X * X * Finds the first occurrence of a substring, pointed to by X * <substr>, within a string pointed to by <string>. X * If the substring is found then a pointer to it within X * <string> is returned, otherwise NULL is returned. X */ X X#define NULL (char *) 0 X X Xchar *strstr( string, substr ) X char *string; X char *substr; X X { X register char head_string; X register char head_substr; X X if ( string == NULL || substr == NULL ) X return( NULL ); X X head_substr = *substr++; X X while ( (head_string = *string++) != '\0' ) X if ( head_string == head_substr ) X { X register char *tail_string = string; X register char *tail_substr = substr; X X do { X if ( *tail_substr == '\0' ) X return( string - 1 ); X } while ( *tail_string++ == *tail_substr++ ); X } X X return( NULL ); X } / echo x - strtok.3 gres '^X' '' > strtok.3 << '/' XSUBROUTINES X strtok(3) - scan for a token in a string X XINVOCATION X #include <string.h> X X char *strtok( string, char_set ) X char *string; X char *char_set; X X char *strtok( NULL, char_set ) X char *char_set; X XEXPLANATION X This function is used to divide up a string into tokens. X Strtok(3) is called with <string> pointing to the string X to be scanned and <char_set> pointing to a string which X consists of the set of separator characters. Tokens are X substrings bordered by separator characters. A pointer to X the first token encountered is returned. X X Subsequent scans of the same <string> use the second call X format. X XRESULTS X A pointer to the next token. Each token is terminated by X a '\0'. If there are no tokens remaining in the string X then NULL is returned. / echo x - strtok.c gres '^X' '' > strtok.c << '/' X/* strtok(3) X * X * Author: Terrence W. Holm July 1988 X * X * X * This function is used to divide up a string into tokens. X * Strtok(3) is called with <string> pointing to the string X * to be scanned and <char_set> pointing to a string which X * consists of the set of separator characters. Tokens are X * substrings bordered by separator characters. A pointer to X * the first token encountered is returned. If <string> is X * NULL then the scan is continued from the last token X * returned. Each token is terminated by a '\0'. If there are X * no tokens remaining in the string then NULL is returned. X */ X X#define NULL (char *) 0 X X Xchar *strtok( string, char_set ) X char *string; X char *char_set; X X { X static char *last_string = ""; X register char *chr; X char *next_token; X X if ( string == NULL ) X string = last_string; X X if ( char_set == NULL ) X return( NULL ); X X X /* First skip over any separator characters */ X X while ( *string != '\0' ) X { X for ( chr = char_set; *chr != '\0'; ++chr ) X if ( *string == *chr ) X break; X X if ( *chr == '\0' ) X break; X X ++string; X } X X X /* Check if we have reached the end of the string */ X X if ( *string == '\0' ) X return( NULL ); X X X /* If not, then we have found the next token */ X X next_token = string; X X X /* Scan for the end of this token */ X X while ( *string != '\0' ) X { X for ( chr = char_set; *chr != '\0'; ++chr ) X if ( *string == *chr ) X { X *string = '\0'; X last_string = string + 1; X return( next_token ); X } X X ++string; X } X X last_string = string; X return( next_token ); X } / ---------------------------------------------------------- Edwin L. Froese uw-beaver!ubc-cs!mprg!handel!froese Terrence W. Holm uw-beaver!uvicctr!tholm