| 170 | */ |
| 171 | |
| 172 | LIST * call_rule( OBJECT * rulename, FRAME * caller_frame, ... ) |
| 173 | { |
| 174 | va_list va; |
| 175 | LIST * result; |
| 176 | |
| 177 | FRAME inner[ 1 ]; |
| 178 | frame_init( inner ); |
| 179 | inner->prev = caller_frame; |
| 180 | inner->prev_user = caller_frame->module->user_module |
| 181 | ? caller_frame |
| 182 | : caller_frame->prev_user; |
| 183 | inner->module = caller_frame->module; |
| 184 | |
| 185 | va_start( va, caller_frame ); |
| 186 | for ( ; ; ) |
| 187 | { |
| 188 | LIST * const l = va_arg( va, LIST * ); |
| 189 | if ( !l ) |
| 190 | break; |
| 191 | lol_add( inner->args, l ); |
| 192 | } |
| 193 | va_end( va ); |
| 194 | |
| 195 | result = evaluate_rule( bindrule( rulename, inner->module ), rulename, inner ); |
| 196 | |
| 197 | frame_free( inner ); |
| 198 | |
| 199 | return result; |
| 200 | } |
| 201 | |
| 202 | |
| 203 | /* |
no test coverage detected