Ticket #9202: string_output_and_semicolons.diff

File string_output_and_semicolons.diff, 9.4 KB (added by SF/jestar_jokin, 9 years ago)

patch against svn52202, generated with TortoiseSVN

  • engines/scumm/descumm-common.cpp

     
    242242                pendingElse = false;
    243243        }
    244244}
     245
     246char *put_ascii(char *buf, int i) {
     247        if (i > 31 && i < 128) {
     248                // non-printable chars are escaped by backslashes as so: "\x00"
     249                // backslashes and quote marks are escaped like so: "\\" "\""
     250                if (i == '\\' || i == '"') {
     251                        buf[0] = '\\';
     252                        buf++;
     253                }
     254                buf[0] = i;
     255                buf[1] = 0;
     256                return buf + 1;
     257        }
     258        return buf + sprintf(buf, "\\x%.2X", i);
     259}
     260
     261char *get_string(char *buf) {
     262        byte cmd;
     263        char *e = buf;
     264        bool in = false;
     265        bool in_function = false;
     266        int i;
     267
     268        while ((cmd = get_byte()) != 0) {
     269                if (cmd == 0xFF || cmd == 0xFE) {
     270                        if (in) {
     271                                e += sprintf(e, "\" + ");
     272                                in = false;
     273                        }
     274                        in_function = true;
     275                        i = get_byte();
     276                        switch (i) {
     277                        case 1: // newline
     278                                e += sprintf(e, "newline()");
     279                                break;
     280                        case 2:
     281                                e += sprintf(e, "keepText()");
     282                                break;
     283                        case 3:
     284                                e += sprintf(e, "wait()");
     285                                break;
     286                        case 4:         // addIntToStack
     287                                e += sprintf(e, "getInt(");
     288                                goto addVarToStack;
     289                        case 5:         // addVerbToStack
     290                                e += sprintf(e, "getVerb(");
     291                                goto addVarToStack;
     292                        case 6:         // addNameToStack
     293                                e += sprintf(e, "getName(");
     294                                goto addVarToStack;
     295                        case 7:         // addStringToStack
     296                                e += sprintf(e, "getString(");
     297                        addVarToStack:
     298                                if (g_options.scriptVersion >= 6)  {
     299                                        e = get_var6(e);
     300                                } else {
     301                                        e = get_var(e);
     302                                }
     303                                e += sprintf(e, ")");
     304                                break;
     305                        case 9:
     306                                e += sprintf(e, "startAnim(%d)", get_word());
     307                                break;
     308                        case 10:
     309                                e += sprintf(e, "sound(");
     310                                // positions 2, 3, 6, 7 are the offset in MONSTER.SOU (LE).
     311                                // positions 10, 11, 14, 15 are the VCTL block size (LE).
     312                                {
     313                                        // show the voice's position in the MONSTER.SOU
     314                                    int p = 0;
     315                                    p += get_word();
     316                                    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
     317                                    p += get_word() << 2;
     318                                    e += sprintf(e, "0x%X, ", p);
     319
     320                                    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
     321
     322                                    // show the size of the VCTL chunk/lip-synch tags
     323                                    p = 0;
     324                                    p += get_word();
     325                                    g_scriptCurPos += 2; // skip the next "0xFF 0x0A"
     326                                    p += get_word() << 2;
     327                                    e += sprintf(e, "0x%X)", p);
     328                                }
     329                                break;
     330                        case 12:
     331                                e += sprintf(e, "setColor(%d)", get_word());
     332                                break;
     333                        case 13: // was unk2
     334                                e += sprintf(e, "unknown13(%d)", get_word());
     335                                break;
     336                        case 14:
     337                                e += sprintf(e, "setFont(%d)", get_word());
     338                                break;
     339                        case 32: // Workaround for a script bug in Indy3
     340                        case 46: // Workaround for a script bug in Indy3
     341                                if (g_options.scriptVersion == 3 && g_options.IndyFlag) {
     342                                        buf += sprintf(buf, "\\x%.2X", 0xE1); // should output German "sz" in-game.
     343                                        continue;
     344                                }
     345                                // fall-through
     346                        default:
     347                                e += sprintf(e, "unknown%d(%d)", i, get_word());
     348                        }
     349                } else {
     350                        if (in_function) {
     351                                e += sprintf(e, " + ");
     352                                in_function = false;
     353                        }
     354                        if (!in) {
     355                                *e++ = '"';
     356                                in = true;
     357                        }
     358                        e = put_ascii(e, cmd);
     359                }
     360        }
     361        if (in)
     362                *e++ = '"';
     363        *e = 0;
     364        return e;
     365}
  • engines/scumm/descumm.cpp

     
    568568        return strecpy(buf, "]");
    569569}
    570570
    571 char *putascii(char *buf, int i) {
    572         if (i > 31 && i < 128) {
    573                 // non-printable chars are escaped by backslashes as so: "\x00"
    574                 // backslashes and quote marks are escaped like so: "\\" "\""
    575                 if (i == '\\' || i == '"') {
    576                         buf[0] = '\\';
    577                         buf++;
    578                 }
    579                 buf[0] = i;
    580                 buf[1] = 0;
    581                 return buf + 1;
    582         }
    583         return buf + sprintf(buf, "\\x%.2X", i);
    584 }
    585571
    586 char *get_ascii(char *buf) {
    587         int i;
    588 
    589         buf = strecpy(buf, "\"");
    590 
    591         do {
    592                 i = get_byte();
    593                 if (!i)
    594                         break;
    595                 buf = putascii(buf, i);
    596                 if (i == 255) {
    597                         i = get_byte();
    598                         buf = putascii(buf, i);
    599 
    600                         // Workaround for a script bug in Indy3
    601                         if (i == 46 && g_options.scriptVersion == 3 && g_options.IndyFlag)
    602                                 continue;
    603 
    604                         if (i != 1 && i != 2 && i != 3 && i != 8) {
    605                                 buf = putascii(buf, get_byte());
    606                                 buf = putascii(buf, get_byte());
    607                         }
    608                 }
    609         } while (1);
    610 
    611         return strecpy(buf, "\"");
    612 }
    613 
    614 
    615 
    616572char *add_a_tok(char *buf, int type) {
    617573        switch (type) {
    618574        case TOK_BYTE:
     
    628584                buf = get_list(buf);
    629585                break;
    630586        case TOK_ASCII:
    631                 buf = get_ascii(buf);
     587                buf = get_string(buf);
    632588                break;
    633589        case TOK_CHAR:
    634590                error("this code seems to be dead");
    635                 buf = putascii(buf, get_byte());
     591                buf = put_ascii(buf, get_byte());
    636592                break;
    637593        }
    638594        return buf;
     
    681637        } else {
    682638                if (!(args & ANOLASTPAREN)) {
    683639                buf = strecpy(buf, ")");
    684         }
     640                }
    685641                if (!(args & ANOENDSEMICOLON) && buf[(strlen(buf) - 1)] != ';') {
    686642                        buf = strecpy(buf, ";");
    687643                }
     
    955911        buf = strchr(strcpy(buf, "PutCodeInString("), 0);
    956912        buf = get_var_or_byte(buf, opcode & 0x80);
    957913        buf = strchr(strcpy(buf, ", "), 0);
    958         buf = get_ascii(buf);
     914        buf = get_string(buf);
    959915        strcpy(buf, ");");
    960916}
    961917
     
    14771433                        break;
    14781434                case 0xF:{
    14791435                                buf = strecpy(buf, "Text(");
    1480                                 buf = get_ascii(buf);
     1436                                buf = get_string(buf);
    14811437                                buf = strecpy(buf, ")");
    14821438                        }
    14831439                        goto exit_proc;
     
    19341890        case 0xF9:{
    19351891                        buf = strecpy(buf, "doSentence(");
    19361892                        if (!(opcode & 0x80) && *g_scriptCurPos == 0xFC) {
    1937                                 strcpy(buf, "STOP)");
     1893                                strcpy(buf, "STOP);");
    19381894                                g_scriptCurPos++;
    19391895                        } else if (!(opcode & 0x80) && *g_scriptCurPos == 0xFB) {
    1940                                 strcpy(buf, "RESET)");
     1896                                strcpy(buf, "RESET);");
    19411897                                g_scriptCurPos++;
    19421898                        } else {
    19431899                                do_tok(buf, "",
     
    23132269                        int i;
    23142270                        char first = 1;
    23152271
    2316                         buf = do_tok(buf, "setVarRange", A1V | ANOLASTPAREN);
     2272                        buf = do_tok(buf, "setVarRange", A1V | ANOLASTPAREN | ANOENDSEMICOLON);
    23172273                        i = get_byte();
    23182274
    23192275                        buf += sprintf(buf, ",%d,[", i);
     
    32843240                        buf = strecpy(buf, "doSentence(");
    32853241                        // FIXME: this is not exactly what ScummVM does...
    32863242                        if (!(opcode & 0x80) && (*g_scriptCurPos == 0xFE)) {
    3287                                 strcpy(buf, "STOP)");
     3243                                strcpy(buf, "STOP);");
    32883244                                g_scriptCurPos++;
    32893245                        } else {
    32903246                                do_tok(buf, "",
     
    33673323        case 0xFF:
    33683324                buf =
    33693325                        do_tok(buf, "drawBox",
    3370                                                  ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W) | ANOLASTPAREN);
     3326                                                 ((opcode & 0x80) ? A1V : A1W) | ((opcode & 0x40) ? A2V : A2W) | ANOLASTPAREN | ANOENDSEMICOLON);
    33713327                opcode = get_byte();
    33723328                do_tok(buf, NULL,
    33733329                                         ASTARTCOMMA | ANOFIRSTPAREN | ((opcode & 0x80) ? A1V : A1W) |
     
    35103466                        int i;
    35113467                        char first = 1;
    35123468
    3513                         buf = do_tok(buf, "setVarRange", A1V | ANOLASTPAREN);
     3469                        buf = do_tok(buf, "setVarRange", A1V | ANOLASTPAREN | ANOENDSEMICOLON);
    35143470                        i = get_byte();
    35153471
    35163472                        buf += sprintf(buf, ",%d,[", i);
     
    36743630                                        break;
    36753631                                case 0x03:
    36763632                                        buf += sprintf(buf, ", Open(");
    3677                                         buf = get_ascii(buf);
     3633                                        buf = get_string(buf);
    36783634                                        buf += sprintf(buf, ")");
    36793635                                        break;
    36803636                                case 0x04:
  • engines/scumm/descumm.h

     
    172172extern bool maybeAddBreak(uint cur, uint to);
    173173extern void writePendingElse();
    174174
     175extern char *put_ascii(char *buf, int i);
     176extern char *get_string(char *buf);
     177
     178extern char *get_var(char *buf);
     179extern char *get_var6(char *buf);
     180
    175181//
    176182// Entry points for the descumming
    177183//
     
    184190extern void next_line_HE_V100(char *buf);
    185191
    186192
    187 
    188193#endif
  • engines/scumm/descumm6.cpp

     
    10631063        return new ListStackEnt(pop());
    10641064}
    10651065
     1066char *get_var6(char *buf) {
     1067        VarStackEnt tmp(get_word());
     1068        return tmp.asText(buf);
     1069}
     1070
    10661071void invalidop(const char *cmd, int op) {
    10671072        if (cmd)
    10681073                error("Unknown opcode %s:0x%x (stack count %d)", cmd, op, num_stack);
     
    11591164        delete se;
    11601165}
    11611166
     1167
    11621168StackEnt *se_get_string() {
    1163         byte cmd;
    11641169        char buf[1024];
    1165         char *e = buf;
    1166         bool in = false;
    1167         int i;
    1168 
    1169         while ((cmd = get_byte()) != 0) {
    1170                 if (cmd == 0xFF || cmd == 0xFE) {
    1171                         if (in) {
    1172                                 *e++ = '"';
    1173                                 in = false;
    1174                         }
    1175                         i = get_byte();
    1176                         switch (i) {
    1177                         case 1:
    1178                                 e += sprintf(e, ":newline:");
    1179                                 break;
    1180                         case 2:
    1181                                 e += sprintf(e, ":keeptext:");
    1182                                 break;
    1183                         case 3:
    1184                                 e += sprintf(e, ":wait:");
    1185                                 break;
    1186                         case 4:         // addIntToStack
    1187                         case 5:         // addVerbToStack
    1188                         case 6:         // addNameToStack
    1189                         case 7:         // addStringToStack
    1190                                 {
    1191                                 VarStackEnt tmp(get_word());
    1192                                 e += sprintf(e, ":");
    1193                                 e = tmp.asText(e);
    1194                                 e += sprintf(e, ":");
    1195                                 }
    1196                                 break;
    1197                         case 9:
    1198                                 e += sprintf(e, ":startanim=%d:", get_word());
    1199                                 break;
    1200                         case 10:
    1201                                 e += sprintf(e, ":sound:");
    1202                                 g_scriptCurPos += 14;
    1203                                 break;
    1204                         case 14:
    1205                                 e += sprintf(e, ":setfont=%d:", get_word());
    1206                                 break;
    1207                         case 12:
    1208                                 e += sprintf(e, ":setcolor=%d:", get_word());
    1209                                 break;
    1210                         case 13:
    1211                                 e += sprintf(e, ":unk2=%d:", get_word());
    1212                                 break;
    1213                         default:
    1214                                 e += sprintf(e, ":unk%d=%d:", i, get_word());
    1215                         }
    1216                 } else {
    1217                         if (!in) {
    1218                                 *e++ = '"';
    1219                                 in = true;
    1220                         }
    1221                         *e++ = cmd;
    1222                 }
    1223         }
    1224         if (in)
    1225                 *e++ = '"';
    1226         *e = 0;
     1170        get_string(buf); // ignore returned value
    12271171        return se_complex(buf);
    12281172}
    12291173