6 struct param params[MAX_PARAMS];
9 skip_spaces(const char *src)
17 match_spaces(const char *src)
19 return *src == '\0' || isspace(*src) ? skip_spaces(src) : NULL;
23 match_terminal(const char *src, char terminal)
25 return terminal == ' '
27 : tolower(*src) == tolower(terminal) ? src + 1 : NULL;
31 match_tag(const char *src, const char *tag)
33 while (src != NULL && *tag != '\0')
34 src = match_terminal(src, *tag++);
39 compare_with_param(const char *tag, enum distance dist, struct param *par)
41 int diff = strlen(tag) - strlen(par->tag);
43 diff = par->distance - dist;
50 match_param(const char *src, struct param *par, int loose)
53 const char *rest_of_src = loose ? src + strlen(src) : NULL;
57 = *src == '\0' ? dist_no_obj_specified : dist_unknown_obj;
61 enum distance dist = distance_to(obj);
62 for (tag = obj->tags; *tag != NULL; ++tag) {
63 const char *behind_match = match_tag(src, *tag);
64 if (behind_match != NULL
65 && compare_with_param(*tag, dist, par) > 0
67 || *skip_spaces(behind_match)
73 rest_of_src = behind_match;
82 match_command(const char *src, const char *pattern)
87 for (par = params; par < params + MAX_PARAMS; ++par) {
89 par->distance = dist_no_obj_specified;
94 for (src = skip_spaces(src); src != NULL && *pattern != '\0';
96 src = isupper(*pattern)
97 ? match_param(src, param_by_letter(*pattern),
99 : *pattern == '?' ? src
100 : match_terminal(src, *pattern);
103 return src != NULL && *skip_spaces(src) == '\0';