13 static const int StringSize = 256;
\r
17 char * Star[STAR_NUMBER];
\r
21 static bool match_rec (char string[], const char pattern[], char * star[]);
\r
27 bool match(char string[], const char pattern[]) {
\r
29 ASSERT(string!=NULL);
\r
30 ASSERT(pattern!=NULL);
\r
32 ASSERT(strstr(pattern,"**")==NULL);
\r
34 return match_rec(string,pattern,Star);
\r
39 static bool match_rec(char string[], const char pattern[], char * star[]) {
\r
43 ASSERT(string!=NULL);
\r
44 ASSERT(pattern!=NULL);
\r
47 // iterative matches
\r
49 while ((c=*pattern++) != '*') {
\r
51 } else if (c == '\0') { // end of pattern
\r
52 while (*string == ' ') string++; // skip trailing spaces
\r
53 return *string == '\0';
\r
54 } else if (c == ' ') { // spaces
\r
55 if (*string++ != ' ') return false; // mismatch
\r
56 while (*string == ' ') string++; // skip trailing spaces
\r
57 } else { // normal character
\r
58 if (*string++ != c) return false; // mismatch
\r
62 // recursive wildcard match
\r
66 while (*string == ' ') string++; // skip leading spaces
\r
67 *star++ = string; // remember beginning of star
\r
69 while ((c=*string++) != '\0') { // reject empty-string match
\r
70 if (c != ' ' && match_rec(string,pattern,star)) { // shortest match
\r
71 ASSERT(string>star[-1]);
\r
72 *string = '\0'; // truncate star
\r
82 bool parse_is_ok(const parse_t * parse) {
\r
84 if (parse == NULL) return false;
\r
85 if (parse->string == NULL) return false;
\r
86 if (parse->pos < 0 || parse->pos > strlen(parse->string)) return false;
\r
87 if (parse->keyword_nb < 0 || parse->keyword_nb >= KEYWORD_NUMBER) return false;
\r
94 void parse_open(parse_t * parse, const char string[]) {
\r
96 ASSERT(parse!=NULL);
\r
97 ASSERT(string!=NULL);
\r
99 parse->string = string;
\r
101 parse->keyword_nb = 0;
\r
106 void parse_close(parse_t * parse) {
\r
110 ASSERT(parse_is_ok(parse));
\r
112 parse->string = NULL;
\r
115 for (i = 0; i < parse->keyword_nb; i++) {
\r
116 my_string_clear(&parse->keyword[i]);
\r
119 parse->keyword_nb = 0;
\r
122 // parse_add_keyword()
\r
124 void parse_add_keyword(parse_t * parse, const char keyword[]) {
\r
126 const char * * string;
\r
128 ASSERT(parse_is_ok(parse));
\r
129 ASSERT(keyword!=NULL);
\r
131 if (parse->keyword_nb < KEYWORD_NUMBER) {
\r
133 string = &parse->keyword[parse->keyword_nb];
\r
134 parse->keyword_nb++;
\r
137 my_string_set(string,keyword);
\r
141 // parse_get_word()
\r
143 bool parse_get_word(parse_t * parse, char string[], int size) {
\r
148 ASSERT(parse!=NULL);
\r
149 ASSERT(string!=NULL);
\r
154 for (; parse->string[parse->pos] == ' '; parse->pos++)
\r
157 ASSERT(parse->string[parse->pos]!=' ');
\r
165 c = parse->string[parse->pos];
\r
166 if (c == ' ' || pos >= size-1) c = '\0';
\r
169 if (c == '\0') break;
\r
175 ASSERT(strchr(string,' ')==NULL);
\r
177 return pos > 0; // non-empty word?
\r
180 // parse_get_string()
\r
182 bool parse_get_string(parse_t * parse, char string[], int size) {
\r
185 parse_t parse_2[1];
\r
186 char word[StringSize];
\r
190 ASSERT(parse!=NULL);
\r
191 ASSERT(string!=NULL);
\r
196 for (; parse->string[parse->pos] == ' '; parse->pos++)
\r
199 ASSERT(parse->string[parse->pos]!=' ');
\r
207 parse_open(parse_2,&parse->string[parse->pos]);
\r
209 if (!parse_get_word(parse_2,word,StringSize)) {
\r
210 string[pos] = '\0';
\r
211 parse_close(parse_2);
\r
215 for (i = 0; i < parse->keyword_nb; i++) {
\r
216 if (my_string_equal(parse->keyword[i],word)) {
\r
217 string[pos] = '\0';
\r
218 parse_close(parse_2);
\r
223 parse_close(parse_2);
\r
229 c = parse->string[parse->pos];
\r
230 if (c != ' ') break;
\r
232 if (pos >= size-1) c = '\0';
\r
235 if (c == '\0') break;
\r
245 c = parse->string[parse->pos];
\r
246 if (c == ' ' || pos >= size-1) c = '\0';
\r
249 if (c == '\0') break;
\r
255 string[pos] = '\0';
\r
260 return pos > 0; // non-empty string?
\r
263 // end of parse.cpp
\r