my_strtok.c

References to this file elsewhere.
1 #include <stdio.h>
2 #include "registry.h"
3 #include "protos.h"
4 #include "ctype.h"
5 
6 
7 /* work sort of like strtok but mind quote chars */
8 static char * tokpos = NULL ;
9 char *
10 my_strtok( char * s1 )
11 {
12   char *p, *retval ;
13   int state ;
14   state = 0 ;
15   retval = NULL ;
16   if ( s1 == NULL && tokpos == NULL ) return( NULL ) ;
17   if ( s1 != NULL ) tokpos = s1 ;
18   for ( p = tokpos ; *p ; p++ )
19   {
20     if ( state == 0 && (*p == ' ' || *p == '\t') ) continue ;
21     if ( state == 0 && !(*p == ' ' || *p == '\t') ) { state = 1 ; retval = p ; } ;
22     if      ( state == 1 && (*p == '"') ) { state = 2 ; }
23     else if ( state == 2 && (*p == '"') ) { state = 1 ; }
24     if ( state == 1 && (*p == ' ' || *p == '\t') ) { *p = '\0' ; p++ ; break ; }
25   }
26   tokpos = p ;
27   return( retval ) ;
28 }
29 
30 
31 /* posix like rentrant strtok; not quote safe, and not quite strtok -- new version; skips multi delims  */
32 char *
33 strtok_rentr( char * s1 , char * s2, char ** tokpos )
34 {
35   char *p, *q, *retval ;
36   int match ;
37   retval = NULL ;
38   if ( s1 == NULL && s2 == NULL ) return( NULL ) ;
39   if ( s1 != NULL ) { *tokpos = s1 ; }
40   if ( **tokpos ) retval = *tokpos ;
41   for ( p = *tokpos ; *p ; p++ )
42   {
43     for ( q = s2 ; *q ; q++ )
44     {
45       if ( *p == *q ) { *p = '\0' ; p++ ; goto foundit  ; }
46     }
47   }
48 foundit:
49 /* skip over multi-delims */
50   for ( ; *p ; p++ )
51   {
52     match = 0 ;
53     for ( q = s2 ; *q ; q++ )
54     {
55       if ( *p == *q ) { *p = '\0' ; match++  ; }
56     }
57     if ( match == 0 ) { break ; }
58   }
59   *tokpos = p ;
60   return( retval ) ;
61 }
62 
63 #if 0
64 /* posix like rentrant strtok; not quote safe, and not quite strtok -- won't skip over multiple delims  */
65 char *
66 strtok_rentr( char * s1 , char * s2, char ** tokpos )
67 {
68   char *p, *q, *retval ;
69   retval = NULL ;
70   if ( s1 == NULL && s2 == NULL ) return( NULL ) ;
71   if ( s1 != NULL ) { *tokpos = s1 ; }
72   if ( **tokpos ) retval = *tokpos ;
73   for ( p = *tokpos ; *p ; p++ )
74   {
75     for ( q = s2 ; *q ; q++ )
76     {
77       if ( *p == *q ) { *p = '\0' ; p++ ; goto foundit  ; }
78     }
79   }
80 foundit:
81   *tokpos = p ;
82   return( retval ) ;
83 }
84 #endif
85 
86 make_lower( char * s1 )
87 {
88   char * p ;
89   int state ;
90   state = 0 ;
91   for ( p = s1 ; *p ; p++ )
92   {
93     if      ( state == 0 && *p == '"' ) state = 1 ;
94     else if ( state == 1 && *p == '"' ) state = 0 ;
95     if ( state == 0 )
96     {
97       *p = tolower(*p) ;
98     }
99   }
100   return(0) ;
101 }