TODO: variadic: review
| 739 | |
| 740 | // TODO: variadic: review |
| 741 | static void StringScan(asIScriptGeneric* gen) |
| 742 | { |
| 743 | asIScriptEngine* engine = gen->GetEngine(); |
| 744 | |
| 745 | stringstream ss(*(string*)gen->GetArgObject(0)); |
| 746 | asUINT scanned = 0; |
| 747 | |
| 748 | for (asUINT i = 1; i < (asUINT)gen->GetArgCount(); ++i) |
| 749 | { |
| 750 | int typeId = gen->GetArgTypeId(i); |
| 751 | if (!(typeId & ~asTYPEID_MASK_SEQNBR)) |
| 752 | { |
| 753 | #define AS_STRING_SCAN_IMPL(tid, type) \ |
| 754 | case tid:\ |
| 755 | do {\ |
| 756 | type val;\ |
| 757 | ss >> val;\ |
| 758 | if(!ss) goto end_scan;\ |
| 759 | void* ref = gen->GetArgAddress(i); \ |
| 760 | *(type*)ref = val;\ |
| 761 | } while(0); \ |
| 762 | break |
| 763 | |
| 764 | switch (typeId) |
| 765 | { |
| 766 | AS_STRING_SCAN_IMPL(asTYPEID_BOOL, bool); |
| 767 | |
| 768 | AS_STRING_SCAN_IMPL(asTYPEID_INT16, int16_t); |
| 769 | default: // enum |
| 770 | AS_STRING_SCAN_IMPL(asTYPEID_INT32, int32_t); |
| 771 | AS_STRING_SCAN_IMPL(asTYPEID_INT64, int64_t); |
| 772 | |
| 773 | AS_STRING_SCAN_IMPL(asTYPEID_UINT8, uint8_t); |
| 774 | AS_STRING_SCAN_IMPL(asTYPEID_UINT16, uint16_t); |
| 775 | AS_STRING_SCAN_IMPL(asTYPEID_UINT32, uint32_t); |
| 776 | AS_STRING_SCAN_IMPL(asTYPEID_UINT64, uint64_t); |
| 777 | |
| 778 | AS_STRING_SCAN_IMPL(asTYPEID_FLOAT, float); |
| 779 | AS_STRING_SCAN_IMPL(asTYPEID_DOUBLE, double); |
| 780 | } |
| 781 | } |
| 782 | else if (typeId == engine->GetStringFactory()) |
| 783 | { |
| 784 | string val; |
| 785 | ss >> val; |
| 786 | if (!ss) goto end_scan; |
| 787 | |
| 788 | void* ref = gen->GetArgAddress(i); |
| 789 | *(string*)ref = std::move(val); |
| 790 | } |
| 791 | else // Invalid type |
| 792 | { |
| 793 | goto end_scan; |
| 794 | } |
| 795 | |
| 796 | ++scanned; |
| 797 | } |
| 798 |
nothing calls this directly
no test coverage detected