From fff03c9002583809b556ef5718a3aecb9b63f396 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 6 Apr 2020 01:23:38 +0200 Subject: [PATCH] DIRECTOR: Implement Datum::getPrintable() for printing out --- engines/director/lingo/lingo-builtins.cpp | 3 +- engines/director/lingo/lingo-code.cpp | 6 ++-- engines/director/lingo/lingo-codegen.cpp | 3 +- engines/director/lingo/lingo-the.cpp | 10 ++---- engines/director/lingo/lingo.cpp | 38 ++++++++++++++++++----- engines/director/lingo/lingo.h | 3 +- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp index 62dcb2cea4b..cfc96698fe3 100644 --- a/engines/director/lingo/lingo-builtins.cpp +++ b/engines/director/lingo/lingo-builtins.cpp @@ -290,8 +290,7 @@ void Lingo::printSTUBWithArglist(const char *funcname, int nargs, const char *pr for (int i = 0; i < nargs; i++) { Datum d = _stack[_stack.size() - nargs + i]; - d.makeString(); - s += *d.u.s; + s += d.getPrintable(); if (i != nargs - 1) s += ", "; diff --git a/engines/director/lingo/lingo-code.cpp b/engines/director/lingo/lingo-code.cpp index c61ef6177ba..7a7fb437c26 100644 --- a/engines/director/lingo/lingo-code.cpp +++ b/engines/director/lingo/lingo-code.cpp @@ -217,7 +217,7 @@ void LC::c_printtop(void) { warning("%s", d.u.s->c_str()); break; case POINT: - warning("point(%s, %s", (*d.u.farr)[0].makeString()->c_str(), (*d.u.farr)[1].makeString()->c_str()); + warning("point(%s, %s", (*d.u.farr)[0].getPrintable().c_str(), (*d.u.farr)[1].getPrintable().c_str()); break; case SYMBOL: warning("%s", d.type2str(true)); @@ -226,7 +226,7 @@ void LC::c_printtop(void) { warning("#%s", d.u.s->c_str()); break; case ARRAY: - warning("%s", d.makeString()->c_str()); + warning("%s", d.getPrintable().c_str()); break; default: warning("--unknown--"); @@ -1244,7 +1244,7 @@ void LC::c_tellcode() { uint start = g_lingo->_pc; uint end = g_lingo->readInt() + start - 1; - warning("STUB: c_tellcode(%s)", d1.makeString()->c_str()); + warning("STUB: c_tellcode(%s)", d1.getPrintable().c_str()); g_lingo->_pc = end; } diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp index 83425915286..55f501e84e4 100644 --- a/engines/director/lingo/lingo-codegen.cpp +++ b/engines/director/lingo/lingo-codegen.cpp @@ -92,8 +92,7 @@ void Lingo::printStack(const char *s, uint pc) { for (uint i = 0; i < _stack.size(); i++) { Datum d = _stack[i]; - d.makeString(); - stack += Common::String::format("<%s> ", d.u.s->c_str()); + stack += Common::String::format("<%s> ", d.getPrintable().c_str()); } debugC(5, kDebugLingoExec, "[%3d]: %s", pc, stack.c_str()); } diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp index 919213aa6e5..a1332510d6c 100644 --- a/engines/director/lingo/lingo-the.cpp +++ b/engines/director/lingo/lingo-the.cpp @@ -436,11 +436,7 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) { void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) { if (debugChannelSet(3, kDebugLingoExec)) { - Datum idCopy = id; - Datum dCopy = d; - idCopy.makeString(); - dCopy.makeString(); - debugC(3, kDebugLingoExec, "Lingo::setTheEntity(\"%s\", %s, \"%s\", %s)", field2str(field), idCopy.u.s->c_str(), entity2str(entity), dCopy.u.s->c_str()); + debugC(3, kDebugLingoExec, "Lingo::setTheEntity(\"%s\", %s, \"%s\", %s)", field2str(field), id.getPrintable().c_str(), entity2str(entity), d.getPrintable().c_str()); } switch (entity) { @@ -470,8 +466,8 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) { } void Lingo::setTheMenuItemEntity(int entity, Datum &menuId, int field, Datum &menuItemId, Datum &d) { - warning("STUB: setTheMenuItemEntity(%s, \"%s\", %s, \"%s\", %s)", entity2str(entity), menuId.makeString()->c_str(), field2str(field), - menuItemId.makeString()->c_str(), d.makeString()->c_str()); + warning("STUB: setTheMenuItemEntity(%s, \"%s\", %s, \"%s\", %s)", entity2str(entity), menuId.getPrintable().c_str(), field2str(field), + menuItemId.getPrintable().c_str(), d.getPrintable().c_str()); } Datum Lingo::getTheSprite(Datum &id1, int field) { diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp index a1ba5872c7d..c1618e983a9 100644 --- a/engines/director/lingo/lingo.cpp +++ b/engines/director/lingo/lingo.cpp @@ -446,8 +446,8 @@ double Datum::makeFloat() { return u.f; } -Common::String *Datum::makeString() { - Common::String *s = new Common::String; +Common::String *Datum::makeString(bool printonly) { + Common::String *s = new Common::String(); switch (type) { case INT: *s = Common::String::format("%d", u.i); @@ -460,15 +460,29 @@ Common::String *Datum::makeString() { break; case FLOAT: *s = Common::String::format(g_lingo->_floatPrecisionFormat.c_str(), u.f); + if (printonly) + *s += "f"; // 0.0f break; case STRING: - *s = *u.s; + if (!printonly) { + *s = *u.s; + } else { + *s = Common::String::format("\"%s\"", u.s->c_str()); + } break; case SYMBOL: - *s = Common::String::format("#%s", u.s->c_str()); + if (!printonly) { + *s = Common::String::format("#%s", u.s->c_str()); + } else { + *s = Common::String::format("symbol: #%s", u.s->c_str()); + } break; case OBJECT: - *s = Common::String::format("#%s", u.s->c_str()); + if (!printonly) { + *s = Common::String::format("#%s", u.s->c_str()); + } else { + *s = Common::String::format("object: #%s", u.s->c_str()); + } break; case VOID: *s = "#void"; @@ -497,7 +511,11 @@ Common::String *Datum::makeString() { } } - *s = ((TextCast *)score->_loadedCast->getVal(idx))->_ptext; + if (!printonly) { + *s = ((TextCast *)score->_loadedCast->getVal(idx))->_ptext; + } else { + *s = Common::String::format("reference: \"%s\"", ((TextCast *)score->_loadedCast->getVal(idx))->_ptext.c_str()); + } } break; case ARRAY: @@ -507,7 +525,7 @@ Common::String *Datum::makeString() { if (i > 0) *s += ", "; Datum d = u.farr->operator[](i); - *s += *d.makeString(); + *s += *d.makeString(printonly); } *s += "]"; @@ -516,6 +534,12 @@ Common::String *Datum::makeString() { warning("Incorrect operation makeString() for type: %s", type2str()); } + if (printonly) + return s; + + if (type == STRING) + delete u.s; + u.s = s; type = STRING; diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h index 8817675cc70..b3ffa43bc1f 100644 --- a/engines/director/lingo/lingo.h +++ b/engines/director/lingo/lingo.h @@ -110,7 +110,8 @@ struct Datum { /* interpreter stack type */ double makeFloat(); int makeInt(); - Common::String *makeString(); + Common::String *makeString(bool printonly = false); + Common::String getPrintable() { return *makeString(true); } const char *type2str(bool isk = false); };