Ticket #8513: gob_parse.patch

File gob_parse.patch, 7.7 KB (added by wjp, 18 years ago)

gob_parse.patch

  • parse.cpp

    RCS file: /cvsroot/scummvm/scummvm/gob/parse.cpp,v
    retrieving revision 1.19
    diff -u -r1.19 parse.cpp
     
    7070        return ptr + (n & 0x0FFFFFFF);
    7171}
    7272
    73 int16 Parse::parseExpr(char arg_0, byte *arg_2) {
     73int16 Parse::parseExpr(char stopToken, byte *arg_2) {
    7474        int32 values[20];
    7575        byte operStack[20];
    7676        int32 prevPrevVal;
     
    129129                                *valPtr = encodePtr(_vm->_global->_inter_variables + temp, kInterVar);
    130130                                if (*_vm->_global->_inter_execPtr == 13) {
    131131                                        _vm->_global->_inter_execPtr++;
    132                                         temp += parseValExpr();
     132                                        temp += parseValExpr(12);
    133133                                        *operPtr = 20;
    134134                                        *valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
    135135                                }
     
    145145                                offset = 0;
    146146                                dim = 0;
    147147                                for (dim = 0; dim < dimCount; dim++) {
    148                                         temp2 = parseValExpr();
     148                                        temp2 = parseValExpr(12);
    149149                                        offset = offset * arrDescPtr[dim] + temp2;
    150150                                }
    151151
     
    156156                                *valPtr = encodePtr(_vm->_global->_inter_variables + temp * 4 + offset * _vm->_global->_inter_animDataSize * 4, kInterVar);
    157157                                if (*_vm->_global->_inter_execPtr == 13) {
    158158                                        _vm->_global->_inter_execPtr++;
    159                                         temp2 = parseValExpr();
     159                                        temp2 = parseValExpr(12);
    160160                                        *operPtr = 20;
    161161                                        *valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
    162162                                }
     
    262262                        continue;
    263263                }               // op>= 19 && op <= 29
    264264
    265                 if (operation == arg_0 || operation == 30 || operation == 31 || operation == 10) {
     265                if (operation == stopToken || operation == 30 || operation == 31 || operation == 10) {
    266266                        while (stkPos >= 2) {
    267267                                var_1A = 0;
    268                                 if (operPtr[-2] == 9 && (operation == 10 || operation == arg_0)) {
     268                                if (operPtr[-2] == 9 && (operation == 10 || operation == stopToken)) {
    269269                                        operPtr[-2] = operPtr[-1];
    270270                                        if (operPtr[-2] == 20 || operPtr[-2] == 22)
    271271                                                valPtr[-2] = valPtr[-1];
     
    324324                                                }       // switch
    325325                                        }       // stkPos > 2
    326326
    327                                         if (operation != arg_0)
     327                                        if (operation != stopToken)
    328328                                                break;
    329329                                }       // if (operPtr[-2] == 9 && ...)
    330330
     
    549549                                                operPtr -= 2;
    550550                                                valPtr -= 2;
    551551                                        } else {
    552                                                 skipExpr(arg_0);
     552                                                skipExpr(stopToken);
    553553                                        }
    554554                                        operation = _vm->_global->_inter_execPtr[-1];
    555555                                        if (stkPos > 0 && operPtr[-1] == 11) {
     
    570570                                valPtr--;
    571571                        }
    572572
    573                         if (operation != arg_0)
     573                        if (operation != stopToken)
    574574                                continue;
    575575
    576576                        if (arg_2 != 0)
     
    602602                                break;
    603603                        }
    604604                        return 0;
    605                 }               // operation == arg_0 || operation == 30 || operation == 31 || operation == 10
     605                }               // operation == stopToken || operation == 30 || operation == 31 || operation == 10
    606606
    607607                if (operation < 1 || operation > 11) {
    608608                        if (operation < 32 || operation > 37)
     
    640640        }
    641641}
    642642
    643 void Parse::skipExpr(char arg_0) {
     643void Parse::skipExpr(char stopToken) {
    644644        int16 dimCount;
    645645        char operation;
    646646        int16 num;
     
    707707                if (operation == 10)
    708708                        num--;
    709709
    710                 if (operation != arg_0)
     710                if (operation != stopToken)
    711711                        continue;
    712712
    713                 if (arg_0 != 10 || num < 0)
     713                if (stopToken != 10 || num < 0)
    714714                        return;
    715715        }
    716716}
    717717
    718 int16 Parse::parseValExpr() {
     718int16 Parse::parseValExpr(unsigned stopToken) {
    719719        int16 values[20];
    720720        byte operStack[20];
    721721        int16 *valPtr;
     
    735735        oldflag = flag;
    736736        if (flag == 0) {
    737737                flag = 1;
    738                 printExpr(99);
     738                printExpr(stopToken);
    739739        }
    740740
    741741        stkPos = -1;
     
    767767                        case 25:
    768768                                temp = _vm->_inter->load16() * 4;
    769769                                _vm->_global->_inter_execPtr++;
    770                                 temp += parseValExpr();
     770                                temp += parseValExpr(12);
    771771                                *valPtr = (uint8)*(_vm->_global->_inter_variables + temp);
    772772                                break;
    773773
     
    779779                                _vm->_global->_inter_execPtr += dimCount;
    780780                                offset = 0;
    781781                                for (dim = 0; dim < dimCount; dim++) {
    782                                         temp2 = parseValExpr();
     782                                        temp2 = parseValExpr(12);
    783783                                        offset = arrDesc[dim] * offset + temp2;
    784784                                }
    785785                                if (operation == 26) {
    786786                                        *valPtr = (uint16)VAR(temp + offset);
    787787                                } else {
    788788                                        _vm->_global->_inter_execPtr++;
    789                                         temp2 = parseValExpr();
     789                                        temp2 = parseValExpr(12);
    790790                                        *valPtr = (uint8)*(_vm->_global->_inter_variables + temp * 4 + offset * 4 * _vm->_global->_inter_animDataSize + temp2);
    791791                                }
    792792                                break;
     
    930930                }
    931931
    932932                if (operation != 10) {
     933                        if (operation != stopToken) {
     934                                debug(5, "stoptoken error: %d != %d", operation, stopToken);
     935                        }
    933936                        flag = oldflag;
    934937                        return values[0];
    935938                }
     
    959962                debug(5, "oper = %d", (int16)*_vm->_global->_inter_execPtr);
    960963                if (operation == 25 && *_vm->_global->_inter_execPtr == 13) {
    961964                        _vm->_global->_inter_execPtr++;
    962                         val = parseValExpr();
     965                        val = parseValExpr(12);
    963966                        temp += val;
    964967                        debug(5, "parse subscript = %d", val);
    965968                }
     
    973976                _vm->_global->_inter_execPtr += dimCount;
    974977                offset = 0;
    975978                for (dim = 0; dim < dimCount; dim++) {
    976                         temp2 = parseValExpr();
     979                        temp2 = parseValExpr(12);
    977980                        offset = arrDesc[dim] * offset + temp2;
    978981                }
    979982                offset *= 4;
     
    982985
    983986                if (*_vm->_global->_inter_execPtr == 13) {
    984987                        _vm->_global->_inter_execPtr++;
    985                         temp += parseValExpr();
     988                        temp += parseValExpr(12);
    986989                }
    987990                return offset * _vm->_global->_inter_animDataSize + temp;
    988991
     
    991994        }
    992995}
    993996
    994 void Parse::printExpr(char arg_0) {
     997void Parse::printExpr(char stopToken) {
    995998        int16 dimCount;
    996999        char operation;
    9971000        int16 num;
     
    10011004        char saved = 0;
    10021005        static char *savedPos = 0;
    10031006
    1004         // printExpr() is not safe function. It suffers from unability to process
    1005         // stopTokens. So enable it only temporary when you need debugging.
     1007        // printExpr() is not a necessary function, and might
     1008        // cause stability problems if it fails to parse an expression
     1009        // Enable it only temporarily when you need debugging.
    10061010        return;
    10071011
    10081012        if (savedPos == 0) {
     
    10311035                                break;
    10321036
    10331037                        case 23:
    1034                                 debug(5, "var_%d", _vm->_inter->load16());
     1038                        {
     1039                                int16 varnum = _vm->_inter->load16();
     1040                                debug(5, "var_%d (val=%d)", varnum, READ_LE_UINT32(_vm->_global->_inter_variables + varnum * 4) );
    10351041                                break;
    1036 
     1042                        }
    10371043                        case 25:
    10381044                                debug(5, "(&var_%d)", _vm->_inter->load16());
    10391045                                if (*_vm->_global->_inter_execPtr == 13) {
     
    10861092                                printExpr(10);
    10871093                                break;
    10881094
    1089                         case 12:
    1090                                 debug(5, "}");
    1091                                 break;
    1092 
    10931095                        default:
    10941096                                debug(5, "<%d>", (int16)operation);
    10951097                                break;
     
    11791181
    11801182                case 12:
    11811183                        debug(5, "}");
     1184                        if (stopToken != 12) {
     1185                                debug(5, "Closing paren without opening?");
     1186                        }
    11821187                        break;
    11831188
    11841189                default:
     
    12001205                if (operation == 10)
    12011206                        num--;
    12021207
    1203                 if (operation == arg_0) {
    1204                         if (arg_0 != 10 || num < 0) {
     1208                if (operation == stopToken) {
     1209                        if (stopToken != 10 || num < 0) {
    12051210
    12061211                                if (saved != 0) {
    12071212                                        _vm->_global->_inter_execPtr = savedPos;
     
    12311236                if (operation == 25 && *_vm->_global->_inter_execPtr == 13) {
    12321237                        _vm->_global->_inter_execPtr++;
    12331238                        debug(5, "+");
    1234                         printExpr(99);
     1239                        printExpr(12);
    12351240                }
    12361241                break;
    12371242
     
    12521257                if (operation == 28 && *_vm->_global->_inter_execPtr == 13) {
    12531258                        _vm->_global->_inter_execPtr++;
    12541259                        debug(5, "+");
    1255                         printExpr(99);
     1260                        printExpr(12);
    12561261                }
    12571262                break;
    12581263
  • parse.h

    RCS file: /cvsroot/scummvm/scummvm/gob/parse.h,v
    retrieving revision 1.6
    diff -u -r1.6 parse.h
     
    2828public:
    2929        int16 parseExpr(char stopToken, byte *resultPtr);
    3030        void skipExpr(char stopToken);
    31         int16 parseValExpr(void);
     31        int16 parseValExpr(unsigned stopToken=99);
    3232        int16 parseVarIndex(void);
    3333        void printExpr(char stopToken);
    3434        void printVarIndex(void);