program define loop *! version 1.1.1 STB-37 ip17 qui version local i = max(4, _result(1)) version `i'.0 /* use Version 5.0, if possible */ #delimit ; local options "Cmd(string) Iter(integer 1) More Noisily Review Step Verbose While(string)"; #delimit cr parse "`*'" if "`cmd'" == "" { local cmd "$LOOP_CMD" } else { local i : word 1 of `cmd' local i = index("`i'", "MAC") if `i' { local i : word 2 of `cmd' local cmd "$`i'" } else { xp LOOP_CMD `cmd' local cmd "$LOOP_CMD" } } if "`cmd'" == "" { di in red "No commands found" error 499 } local clr "white" if "`review'" != "" { local review "*" local rev ">" local verbose 1 local while local clr "blue" } local guard "(\$I_ < \$_iter)" if "`while'" != "" { xp LOOP___0 `while' if `iter' < 2 { local guard "\$LOOP___0"} else { local guard "(\$I_ < \$_iter) & (\$LOOP___0)" } } if "`verbose'" != "" { local verbose } else { local verbose "*" } if "`step'" != "" { local step "more" } if "`noisily'" == "" { local noisily "quietly" } parse "`cmd'", parse(";") local i 1 while "``i''" != "" { local nw : word count ``i'' local ii : word `nw' of ``i'' if "`ii'" == "I_" { local nw = `nw' - 1 local ii : word `nw' of ``i'' if "`ii'" == "in" { xt ``i'' local `i' "$LOOP___0 \$I_" } } local i = `i' + 1 } if "$LOOP___D" == "" { global LOOP___D 1 } else { global LOOP___D = $LOOP___D + 1 local Ibak "$I_" } global I_ 0 `noisily' while `guard' { global I_ = $I_ + 1 `verbose' noi di _n in bl "-> Iteration $I_:" local ii 1 while "``ii''" != "" { if "``ii''" != ";" { `verbose' noi di in `clr' "`rev'. ``ii''`IX`ii''" `review' ``ii'' local ii = `ii' + 2 } else { local ii = `ii' + 1 } `more' } `step' } global LOOP_0 "$I_" global LOOP___D = $LOOP___D - 1 if $LOOP___D == 0 { global LOOP___D global LOOP___0 global I_ } else { global I_ "`Ibak'" } end program define xt local n : word count `*' local `n' global LOOP___0 "`*'" end program define xp local a "`1'" mac shift parse "`*'", parse("\[]") global `a' while "`1'" != "" { if "`1'" == "\" { if "`2'" == "[" { mac shift local 1 "(" } else if "`2'" == "]" { mac shift local 1 ")" if "`2'" != "\" { local 1 ") " } } } global `a' "${`a'}`1'" mac shift } end