void Lingo::addCode(const char *code, ScriptType type, uint16 id) { debug(2, "Add code \"%s\" for type %d with id %d", code, type, id); if (_scripts[type].contains(id)) { delete _scripts[type][id]; } _currentScript = new ScriptData; _currentScriptType = type; _scripts[type][id] = _currentScript; _linenumber = _colnumber = 1; _hadError = false; const char *begin, *end; // macros and factories have conflicting grammar. Thus we ease life for the parser. if ((begin = findNextDefinition(code))) { bool first = true; while ((end = findNextDefinition(begin + 1))) { if (first) { begin = code; first = false; } Common::String chunk(begin, end); if (chunk.hasPrefix("factory") || chunk.hasPrefix("method")) _inFactory = true; else if (chunk.hasPrefix("macro")) _inFactory = false; else _inFactory = false; debug(2, "Code chunk:\n#####\n%s#####", chunk.c_str()); parse(chunk.c_str()); _currentScript->clear(); begin = end; } _hadError = true; // HACK: This is for preventing test execution debug(2, "Code chunk:\n#####\n%s#####", begin); parse(begin); } else { parse(code); code1(STOP); } _inFactory = false; if (_currentScript->size() && !_hadError) Common::hexdump((byte *)&_currentScript->front(), _currentScript->size() * sizeof(inst)); }
void Lingo::codeArgStore() { while (true) { if (_argstack.empty()) { break; } Common::String *arg = _argstack.back(); _argstack.pop_back(); code1(c_varpush); codeString(arg->c_str()); code1(c_assign); code1(c_xpop); delete arg; } }
void code_init(void) { main_code_p = new_code(); active_code = *main_code_p; code1(_OMAIN); }