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)
33 match_tag(const char *src, const char *tag)
35 while (src != NULL && *tag != '\0')
36 src = match_terminal(src, *tag++);
41 compare_with_param(const char *tag, enum distance dist, struct param *par)
43 int diff = strlen(tag) - strlen(par->tag);
45 diff = par->distance - dist;
52 match_param(const char *src, struct param *par, int loose)
55 const char *rest_of_src = loose ? src + strlen(src) : NULL;
58 par->distance = *src == '\0' ? dist_no_obj_specified : dist_unknown_obj;
62 enum distance dist = distance_to(obj);
63 for (tag = obj->tags; *tag != NULL; ++tag) {
64 const char *behind_match = match_tag(src, *tag);
65 if (behind_match != NULL &&
66 compare_with_param(*tag, dist, par) > 0 &&
67 (!loose || *skip_spaces(behind_match) == '\0')) {
72 rest_of_src = behind_match;
81 match_command(const char *src, const char *pattern)
86 for (par = params; par < params + MAX_PARAMS; ++par) {
88 par->distance = dist_no_obj_specified;
93 for (src = skip_spaces(src); src != NULL && *pattern != '\0'; ++pattern) {
94 src = isupper(*pattern)
95 ? match_param(src, param_by_letter(*pattern),
99 : match_terminal(src, *pattern);
102 return src != NULL && *skip_spaces(src) == '\0';