void count_implicit_rule_limits () { char *name; unsigned int namelen; register struct rule *rule, *lastrule; num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; max_pattern_dep_length = 0; name = 0; namelen = 0; rule = pattern_rules; lastrule = 0; while (rule != 0) { unsigned int ndeps = 0; register struct dep *dep; struct rule *next = rule->next; unsigned int ntargets; ++num_pattern_rules; ntargets = 0; while (rule->targets[ntargets] != 0) ++ntargets; if (ntargets > max_pattern_targets) max_pattern_targets = ntargets; for (dep = rule->deps; dep != 0; dep = dep->next) { unsigned int len = strlen (dep->name); #ifdef VMS char *p = rindex (dep->name, ']'); #else char *p = rindex (dep->name, '/'); #endif char *p2 = p != 0 ? index (dep->name, '%') : 0; ndeps++; if (len > max_pattern_dep_length) max_pattern_dep_length = len; if (p != 0 && p2 > p) { /* There is a slash before the % in the dep name. Extract the directory name. */ if (p == dep->name) ++p; if (p - dep->name > namelen) { if (name != 0) free (name); namelen = p - dep->name; name = (char *) xmalloc (namelen + 1); } bcopy (dep->name, name, p - dep->name); name[p - dep->name] = '\0'; /* In the deps of an implicit rule the `changed' flag actually indicates that the dependency is in a nonexistent subdirectory. */ dep->changed = !dir_file_exists_p (name, ""); #ifdef VMS if (dep->changed && *name == ']') #else if (dep->changed && *name == '/') #endif { /* The name is absolute and the directory does not exist. This rule can never possibly match, since this dependency can never possibly exist. So just remove the rule from the list. */ freerule (rule, lastrule); --num_pattern_rules; goto end_main_loop; } } else /* This dependency does not reside in a subdirectory. */ dep->changed = 0; } if (ndeps > max_pattern_deps) max_pattern_deps = ndeps; lastrule = rule; end_main_loop: rule = next; } if (name != 0) free (name); }
void freerules(Rule **r) { while(*r) freerule(*r++); }
void count_implicit_rule_limits () { char *name; unsigned int namelen; register struct rule *rule, *lastrule; num_pattern_rules = 0; name = 0; namelen = 0; rule = pattern_rules; lastrule = 0; while (rule != 0) { unsigned int ndeps = 0; register struct dep *dep; struct rule *next = rule->next; ++num_pattern_rules; for (dep = rule->deps; dep != 0; dep = dep->next) { unsigned int len = strlen (dep->name); char *p = rindex (dep->name, '/'); char *p2 = p != 0 ? index (dep->name, '%') : 0; ndeps++; if (len > max_pattern_dep_length) max_pattern_dep_length = len; if (p != 0 && p2 > p) { /* There is a slash before the % in the dep name. Extract the directory name. */ if (p == dep->name) ++p; if (p - dep->name > namelen) { if (name != 0) free (name); namelen = p - dep->name; name = (char *) xmalloc (namelen + 1); } bcopy (dep->name, name, p - dep->name); name[p - dep->name] = '\0'; if (!dir_file_exists_p (name, ".")) { /* The name is absolute and the directory does not exist. */ if (*name == '/') { freerule (rule, lastrule); --num_pattern_rules; goto end_main_loop; } else /* The directory does not exist, but it might be found in a VPATH directory. */ rule->subdir = 1; } } } if (ndeps > max_pattern_deps) max_pattern_deps = ndeps; lastrule = rule; end_main_loop: rule = next; } if (name != 0) free (name); }