Make def_visit_all return the actual result of visit.

This way, def_visit_all is a little more useful (though I think I might
redo the one case that's using this feature).
This commit is contained in:
Bill Currie 2012-12-13 09:47:00 +09:00
parent 028b19888f
commit 204a0b3f72
2 changed files with 9 additions and 7 deletions

View file

@ -300,7 +300,8 @@ int def_size (def_t *def);
parameter is \a data passed on. If non-zero is returned, parameter is \a data passed on. If non-zero is returned,
the pass through the alias cluster will terminate. the pass through the alias cluster will terminate.
\param data Pointer to the data needed by \a visit. \param data Pointer to the data needed by \a visit.
\return 1 if \a visit returned non-zero, otherwise 0. \return The value returned by \a visit returned non-zero,
otherwise 0.
*/ */
int def_visit_all (def_t *def, int overlap, int def_visit_all (def_t *def, int overlap,
int (*visit) (def_t *, void *), void *data); int (*visit) (def_t *, void *), void *data);

View file

@ -640,21 +640,22 @@ def_visit_all (def_t *def, int overlap,
int (*visit) (def_t *, void *), void *data) int (*visit) (def_t *, void *), void *data)
{ {
def_t *start_def = def; def_t *start_def = def;
int ret;
if (visit (def, data)) if ((ret = visit (def, data)))
return 1; return ret;
if (def->alias) { if (def->alias) {
def = def->alias; def = def->alias;
if (visit (def, data)) if ((ret = visit (def, data)))
return 1; return ret;
} }
for (def = def->alias_defs; def; def = def->next) { for (def = def->alias_defs; def; def = def->next) {
if (def == start_def) if (def == start_def)
continue; continue;
if (overlap && !def_overlap (def, start_def)) if (overlap && !def_overlap (def, start_def))
continue; continue;
if (visit (def, data)) if ((ret = visit (def, data)))
return 1; return ret;
} }
return 0; return 0;
} }