internal do-anything v[s][n]scanf() formatting system with input from strings or FILE * */
| 565 | /* internal do-anything v[s][n]scanf() formatting system with input |
| 566 | from strings or FILE * */ |
| 567 | int StdioBaseScanf( |
| 568 | struct ParseState* Parser, FILE* Stream, char* StrIn, char* Format, struct StdVararg* Args) |
| 569 | { |
| 570 | struct Value* ThisArg = Args->Param[0]; |
| 571 | int ArgCount = 0; |
| 572 | void* ScanfArg[MAX_SCANF_ARGS]; |
| 573 | |
| 574 | if (Args->NumArgs > MAX_SCANF_ARGS) |
| 575 | { |
| 576 | ProgramFail(Parser, "too many arguments to scanf() - %d max", MAX_SCANF_ARGS); |
| 577 | } |
| 578 | |
| 579 | for (ArgCount = 0; ArgCount < Args->NumArgs; ArgCount++) |
| 580 | { |
| 581 | ThisArg = (struct Value*)((char*)ThisArg + |
| 582 | MEM_ALIGN(sizeof(struct Value) + TypeStackSizeValue(ThisArg))); |
| 583 | |
| 584 | if (ThisArg->Typ->Base == TypePointer) |
| 585 | { |
| 586 | ScanfArg[ArgCount] = ThisArg->Val->Pointer; |
| 587 | } |
| 588 | else if (ThisArg->Typ->Base == TypeArray) |
| 589 | { |
| 590 | ScanfArg[ArgCount] = &ThisArg->Val->ArrayMem[0]; |
| 591 | } |
| 592 | else |
| 593 | { |
| 594 | ProgramFail( |
| 595 | Parser, "non-pointer argument to scanf() - argument %d after format", ArgCount + 1); |
| 596 | } |
| 597 | } |
| 598 | |
| 599 | if (Stream != NULL) |
| 600 | { |
| 601 | return fscanf(Stream, Format, ScanfArg[0], ScanfArg[1], ScanfArg[2], ScanfArg[3], |
| 602 | ScanfArg[4], ScanfArg[5], ScanfArg[6], ScanfArg[7], ScanfArg[8], ScanfArg[9]); |
| 603 | } |
| 604 | else |
| 605 | { |
| 606 | return sscanf(StrIn, Format, ScanfArg[0], ScanfArg[1], ScanfArg[2], ScanfArg[3], |
| 607 | ScanfArg[4], ScanfArg[5], ScanfArg[6], ScanfArg[7], ScanfArg[8], ScanfArg[9]); |
| 608 | } |
| 609 | } |
| 610 | |
| 611 | /* stdio calls */ |
| 612 | void StdioFopen( |
no outgoing calls
no test coverage detected