box typeset_as_atomic (edit_env env, tree t, path ip) { if (is_func (t, WITH)) { int i, n= N(t), k= (n-1)>>1; // is k=0 allowed ? if ((n&1) != 1) return empty_box (ip); STACK_NEW_ARRAY(vars,string,k); STACK_NEW_ARRAY(oldv,tree,k); STACK_NEW_ARRAY(newv,tree,k); for (i=0; i<k; i++) { tree var_t= env->exec (t[i<<1]); if (is_atomic (var_t)) { string var= var_t->label; vars[i]= var; oldv[i]= env->read (var); newv[i]= env->exec (t[(i<<1)+1]); } else { STACK_DELETE_ARRAY(vars); STACK_DELETE_ARRAY(oldv); STACK_DELETE_ARRAY(newv); return empty_box (ip); } } // for (i=0; i<k; i++) env->monitored_write_update (vars[i], newv[i]); for (i=0; i<k; i++) env->write_update (vars[i], newv[i]); box b= typeset_as_atomic (env, t[n-1], descend (ip, n-1)); for (i=k-1; i>=0; i--) env->write_update (vars[i], oldv[i]); STACK_DELETE_ARRAY(vars); STACK_DELETE_ARRAY(oldv); STACK_DELETE_ARRAY(newv); return b; } else if (is_func (t, LOCUS) && N(t) != 0) {
static void restricted_exec (edit_env env, tree t, int end) { if (is_func (t, ASSIGN, 2) && end == 2) env->exec (t); else if (is_document (t) || is_concat (t)) for (int i=0; i < min (end, 10); i++) restricted_exec (env, t[i], arity (t[i])); else if (is_compound (t, "hide-preamble", 1) || is_compound (t, "show-preamble", 1)) env->exec (t[0]); }