| 651 | */ |
| 652 | |
| 653 | void ConfigFile::parse(Stream* stream) |
| 654 | { |
| 655 | String inputLine; |
| 656 | Parameter* previous = NULL; |
| 657 | unsigned int line; |
| 658 | const char* streamName = stream->getFileName(); |
| 659 | |
| 660 | parameters.setSortMode(FB_ARRAY_SORT_MANUAL); |
| 661 | |
| 662 | while (getLine(stream, inputLine, line)) |
| 663 | { |
| 664 | Parameter current; |
| 665 | current.line = line; |
| 666 | |
| 667 | switch (parseLine(streamName, inputLine, current)) |
| 668 | { |
| 669 | case LINE_END_SUB: |
| 670 | case LINE_BAD: |
| 671 | badLine(streamName, inputLine); |
| 672 | |
| 673 | case LINE_REGULAR: |
| 674 | if (current.name.isEmpty()) |
| 675 | badLine(streamName, inputLine); |
| 676 | |
| 677 | previous = ¶meters[parameters.add(current)]; |
| 678 | break; |
| 679 | |
| 680 | case LINE_INCLUDE: |
| 681 | include(streamName, current.value.ToPathName()); |
| 682 | break; |
| 683 | |
| 684 | case LINE_START_SUB: |
| 685 | if (current.name.hasData()) |
| 686 | { |
| 687 | FB_SIZE_T n = parameters.add(current); |
| 688 | previous = ¶meters[n]; |
| 689 | } |
| 690 | |
| 691 | if (!previous) |
| 692 | badLine(streamName, "master parameter is missing before subconfig start '{'"); |
| 693 | |
| 694 | { // subconf scope |
| 695 | SubStream subStream(stream->getFileName()); |
| 696 | int level = 1; |
| 697 | while (getLine(stream, inputLine, line)) |
| 698 | { |
| 699 | switch(parseLine(streamName, inputLine, current)) |
| 700 | { |
| 701 | case LINE_START_SUB: |
| 702 | fb_assert(level > 0); |
| 703 | level++; |
| 704 | subStream.putLine(inputLine, line); |
| 705 | continue; |
| 706 | |
| 707 | case LINE_END_SUB: |
| 708 | level--; |
| 709 | if (level > 0) |
| 710 | { |
nothing calls this directly
no test coverage detected