| 3173 | } |
| 3174 | |
| 3175 | static void argument_compiler_add( struct argument_compiler * c, OBJECT * arg, |
| 3176 | OBJECT * file, int line ) |
| 3177 | { |
| 3178 | switch ( c->state ) |
| 3179 | { |
| 3180 | case ARGUMENT_COMPILER_FOUND_OBJECT: |
| 3181 | |
| 3182 | if ( object_equal( arg, constant_question_mark ) ) |
| 3183 | { |
| 3184 | c->arg.flags = ARG_OPTIONAL; |
| 3185 | } |
| 3186 | else if ( object_equal( arg, constant_plus ) ) |
| 3187 | { |
| 3188 | c->arg.flags = ARG_PLUS; |
| 3189 | } |
| 3190 | else if ( object_equal( arg, constant_star ) ) |
| 3191 | { |
| 3192 | c->arg.flags = ARG_STAR; |
| 3193 | } |
| 3194 | |
| 3195 | dynamic_array_push( c->args, c->arg ); |
| 3196 | c->state = ARGUMENT_COMPILER_START; |
| 3197 | |
| 3198 | if ( c->arg.flags != ARG_ONE ) |
| 3199 | break; |
| 3200 | /* fall-through */ |
| 3201 | |
| 3202 | case ARGUMENT_COMPILER_START: |
| 3203 | |
| 3204 | c->arg.type_name = 0; |
| 3205 | c->arg.index = -1; |
| 3206 | c->arg.flags = ARG_ONE; |
| 3207 | |
| 3208 | if ( is_type_name( object_str( arg ) ) ) |
| 3209 | { |
| 3210 | c->arg.type_name = object_copy( arg ); |
| 3211 | c->state = ARGUMENT_COMPILER_FOUND_TYPE; |
| 3212 | break; |
| 3213 | } |
| 3214 | /* fall-through */ |
| 3215 | |
| 3216 | case ARGUMENT_COMPILER_FOUND_TYPE: |
| 3217 | |
| 3218 | if ( is_type_name( object_str( arg ) ) ) |
| 3219 | { |
| 3220 | printf( "%s:%d: missing argument name before type name: %s\n", |
| 3221 | object_str( file ), line, object_str( arg ) ); |
| 3222 | exit( 1 ); |
| 3223 | } |
| 3224 | |
| 3225 | c->arg.arg_name = object_copy( arg ); |
| 3226 | if ( object_equal( arg, constant_star ) ) |
| 3227 | { |
| 3228 | c->arg.flags = ARG_VARIADIC; |
| 3229 | dynamic_array_push( c->args, c->arg ); |
| 3230 | c->state = ARGUMENT_COMPILER_DONE; |
| 3231 | } |
| 3232 | else |
no test coverage detected