diff options
Diffstat (limited to 'private/crt32/string/strspn.c')
-rw-r--r-- | private/crt32/string/strspn.c | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/private/crt32/string/strspn.c b/private/crt32/string/strspn.c new file mode 100644 index 000000000..f49e8f90c --- /dev/null +++ b/private/crt32/string/strspn.c @@ -0,0 +1,179 @@ +/*** +*strspn.c - find length of initial substring of chars from a control string +* +* Copyright (c) 1985-1993, Microsoft Corporation. All rights reserved. +* +*Purpose: +* defines strspn() - finds the length of the initial substring of +* a string consisting entirely of characters from a control string. +* +* defines strcspn()- finds the length of the initial substring of +* a string consisting entirely of characters not in a control string. +* +* defines strpbrk()- finds the index of the first character in a string +* that is not in a control string +* +*Revision History: +* 06-01-89 JCR C version created. +* 02-27-90 GJF Fixed calling type, #include <cruntime.h>, fixed +* copyright. +* 08-14-90 SBM Removed now redundant #include <stddef.h> +* 10-02-90 GJF New-style function declarators. +* 12-04-90 SRW Made it default to compiling for strspn +* 05-21-93 GJF Used unsigned char pointers to access control and +* source strings. +* +******************************************************************************** + +/* Determine which routine we're compiling for (default to STRSPN) */ + +#define _STRSPN 1 +#define _STRCSPN 2 +#define _STRPBRK 3 + +#if defined(SSTRCSPN) +#define ROUTINE _STRCSPN +#elif defined(SSTRPBRK) +#define ROUTINE _STRPBRK +#else +#define ROUTINE _STRSPN +#endif + +#include <cruntime.h> +#include <string.h> + +/*** +*int strspn(string, control) - find init substring of control chars +* +*Purpose: +* Finds the index of the first character in string that does belong +* to the set of characters specified by control. This is +* equivalent to the length of the initial substring of string that +* consists entirely of characters from control. The '\0' character +* that terminates control is not considered in the matching process. +* +*Entry: +* char *string - string to search +* char *control - string containing characters not to search for +* +*Exit: +* returns index of first char in string not in control +* +*Exceptions: +* +*******************************************************************************/ + +/*** +*int strcspn(string, control) - search for init substring w/o control chars +* +*Purpose: +* returns the index of the first character in string that belongs +* to the set of characters specified by control. This is equivalent +* to the length of the length of the initial substring of string +* composed entirely of characters not in control. Null chars not +* considered. +* +*Entry: +* char *string - string to search +* char *control - set of characters not allowed in init substring +* +*Exit: +* returns the index of the first char in string +* that is in the set of characters specified by control. +* +*Exceptions: +* +*******************************************************************************/ + +/*** +*char *strpbrk(string, control) - scans string for a character from control +* +*Purpose: +* Finds the first occurence in string of any character from +* the control string. +* +*Entry: +* char *string - string to search in +* char *control - string containing characters to search for +* +*Exit: +* returns a pointer to the first character from control found +* in string. +* returns NULL if string and control have no characters in common. +* +*Exceptions: +* +*******************************************************************************/ + + + +/* Routine prototype */ +#if (ROUTINE == _STRSPN) +size_t _CALLTYPE1 strspn ( +#elif (ROUTINE == _STRCSPN) +size_t _CALLTYPE1 strcspn ( +#else /* (ROUTINE == STRPBRK) */ +char * _CALLTYPE1 strpbrk ( +#endif + const char * string, + const char * control + ) +{ + const unsigned char *str = string; + const unsigned char *ctrl = control; + + unsigned char map[32]; + int count; + + /* Clear out bit map */ + for (count=0; count<32; count++) + map[count] = 0; + + /* Set bits in control map */ + while (*ctrl) + { + map[*ctrl >> 3] |= (1 << (*ctrl & 7)); + ctrl++; + } + +#if (ROUTINE == _STRSPN) + + /* 1st char NOT in control map stops search */ + if (*str) + { + count=0; + while (map[*str >> 3] & (1 << (*str & 7))) + { + count++; + str++; + } + return(count); + } + return(0); + +#elif (ROUTINE == _STRCSPN) + + /* 1st char in control map stops search */ + count=0; + map[0] |= 1; /* null chars not considered */ + while (!(map[*str >> 3] & (1 << (*str & 7)))) + { + count++; + str++; + } + return(count); + +#else /* (ROUTINE == _STRPBRK) */ + + /* 1st char in control map stops search */ + while (*str) + { + if (map[*str >> 3] & (1 << (*str & 7))) + return((char *)str); + str++; + } + return(NULL); + +#endif + +} |