GIF89a;
Mass Deface > 1]), [1], [$0_(], [,]m4_eval([$# >> 1])[)])[ [0]_m4_popdef([_m4_cmp]))])_m4_cmp($@)]) m4_define([_m4_list_cmp_], [$0_([$1], m4_eval([$1 + $2]))]) m4_define([_m4_list_cmp__], [[m4_eval([($$1) != ($$2)]), [1], [m4_cmp([$$1], [$$2])], ]]) # m4_max(EXPR, ...) # m4_min(EXPR, ...) # ----------------- # Return the decimal value of the maximum (or minimum) in a series of # integer expressions. # # _m4_foreach to the rescue; we only need to replace _m4_minmax. Here, # we need a temporary macro to track the best answer so far, so that # the foreach expression is tractable. m4_define([_m4_minmax], [m4_pushdef([_m4_best], m4_eval([$2]))_m4_foreach( [m4_define([_m4_best], $1(_m4_best,], [))], m4_shift($@))]dnl [_m4_best[]_m4_popdef([_m4_best])]) # m4_set_add_all(SET, VALUE...) # ----------------------------- # Add each VALUE into SET. This is O(n) in the number of VALUEs, and # can be faster than calling m4_set_add for each VALUE. # # _m4_foreach to the rescue. If no deletions have occurred, then # avoid the speed penalty of m4_set_add. m4_define([m4_set_add_all], [m4_if([$#], [0], [], [$#], [1], [], [m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1]) + m4_len(_m4_foreach(m4_ifdef([_m4_set_cleanup($1)], [[m4_set_add]], [[_$0]])[([$1],], [)], $@))))])]) m4_define([_m4_set_add_all], [m4_ifdef([_m4_set([$1],$2)], [], [m4_define([_m4_set([$1],$2)], [1])m4_pushdef([_m4_set([$1])], [$2])-])])