aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/alan2/reverse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/glk/alan2/reverse.cpp')
-rw-r--r--engines/glk/alan2/reverse.cpp552
1 files changed, 552 insertions, 0 deletions
diff --git a/engines/glk/alan2/reverse.cpp b/engines/glk/alan2/reverse.cpp
new file mode 100644
index 0000000000..cf3e851226
--- /dev/null
+++ b/engines/glk/alan2/reverse.cpp
@@ -0,0 +1,552 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "glk/alan2/types.h"
+#include "glk/alan2/main.h"
+#include "glk/alan2/reverse.h"
+
+namespace Glk {
+namespace Alan2 {
+
+/*----------------------------------------------------------------------
+
+ reversed()
+
+ Return the reversed bytes in the Aword
+
+*/
+#ifdef _PROTOTYPES_
+Aword reversed(Aword w) /* IN - The ACODE word to swap bytes of */
+#else
+Aword reversed(w)
+ Aword w; /* IN - The ACODE word to swap bytes of */
+#endif
+{
+ Aword s; /* The swapped ACODE word */
+ char *wp, *sp;
+ int i;
+
+ wp = (char *) &w;
+ sp = (char *) &s;
+
+ for (i = 0; i < sizeof(Aword); i++)
+ sp[sizeof(Aword)-1 - i] = wp[i];
+
+ return s;
+}
+
+
+#ifdef _PROTOTYPES_
+void reverse(Aword *w) /* IN - The ACODE word to reverse bytes in */
+#else
+void reverse(w)
+ Aword *w; /* IN - The ACODE word to reverse bytes in */
+#endif
+{
+ *w = reversed(*w);
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseTable(Aword adr, int len)
+#else
+static void reverseTable(adr, len)
+ Aword adr;
+ int len;
+#endif
+{
+ Aword *e = &memory[adr];
+ int i;
+
+ if (adr != 0)
+ while (!endOfTable(e)) {
+ for (i = 0; i < len/(int)sizeof(Aword); i++) {
+ reverse(e);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseStms(Aword adr)
+#else
+static void reverseStms(adr)
+ Aword adr;
+#endif
+{
+ Aword *e = &memory[adr];
+
+ if (adr != 0)
+ while (TRUE) {
+ reverse(e);
+ if (*e == ((Aword)C_STMOP<<28|(Aword)I_RETURN)) break;
+ e++;
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseMsgs(Aword adr)
+#else
+static void reverseMsgs(adr)
+ Aword adr;
+#endif
+{
+ MsgElem *e = (MsgElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(MsgElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->stms);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseWrds(Aword adr)
+#else
+static void reverseWrds(adr)
+ Aword adr;
+#endif
+{
+ WrdElem *e = (WrdElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(WrdElem));
+ while (!endOfTable(e)) {
+ if ((e->_class & (1L<<WRD_SYN)) == 0) { /* Do not do this for synonyms */
+ reverseTable(e->adjrefs, sizeof(Aword));
+ reverseTable(e->nounrefs, sizeof(Aword));
+ }
+ e++;
+ }
+ }
+}
+
+#ifdef _PROTOTYPES_
+static void reverseChks(Aword adr)
+#else
+static void reverseChks(adr)
+ Aword adr;
+#endif
+{
+ ChkElem *e = (ChkElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ChkElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->exp);
+ reverseStms(e->stms);
+ e++;
+ }
+ }
+}
+
+#ifdef _PROTOTYPES_
+static void reverseAlts(Aword adr)
+#else
+static void reverseAlts(adr)
+ Aword adr;
+#endif
+{
+ AltElem *e = (AltElem *)&memory[adr];
+
+ if (adr != 0 && !endOfTable(e) && !e->done) {
+ reverseTable(adr, sizeof(AltElem));
+ e->done = TRUE;
+ while (!endOfTable(e)) {
+ reverseChks(e->checks);
+ reverseStms(e->action);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseVrbs(Aword adr)
+#else
+static void reverseVrbs(adr)
+ Aword adr;
+#endif
+{
+ VrbElem *e = (VrbElem *)&memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(VrbElem));
+ while (!endOfTable(e)) {
+ reverseAlts(e->alts);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseSteps(Aword adr)
+#else
+static void reverseSteps(adr)
+ Aword adr;
+#endif
+{
+ StepElem *e = (StepElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(StepElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->exp);
+ reverseStms(e->stm);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseScrs(Aword adr)
+#else
+static void reverseScrs(adr)
+ Aword adr;
+#endif
+{
+ ScrElem *e = (ScrElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ScrElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->dscr);
+ reverseSteps(e->steps);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseActs(Aword adr)
+#else
+static void reverseActs(adr)
+ Aword adr;
+#endif
+{
+ ActElem *e = (ActElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ActElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->nam);
+ reverseTable(e->atrs, sizeof(AtrElem));
+ reverseScrs(e->scradr);
+ reverseVrbs(e->vrbs);
+ reverseStms(e->dscr);
+ e++;
+ }
+ }
+}
+
+#ifdef _PROTOTYPES_
+static void reverseObjs(Aword adr, Boolean v2_5)
+#else
+static void reverseObjs(adr, v2_5)
+ Aword adr;
+ Boolean v2_5; /* TRUE if it's a v2.5 format game */
+#endif
+{
+ ObjElem *e = (ObjElem *) &memory[adr];
+ ObjElem25 *e25 = (ObjElem25 *) &memory[adr];
+
+ if (v2_5) {
+ if (adr != 0 && !endOfTable(e25)) {
+ reverseTable(adr, sizeof(ObjElem25));
+ while (!endOfTable(e25)) {
+ reverseTable(e25->atrs, sizeof(AtrElem));
+ reverseVrbs(e25->vrbs);
+ reverseStms(e25->dscr1);
+ reverseStms(e25->dscr2);
+ e25++;
+ }
+ }
+ } else {
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ObjElem));
+ while (!endOfTable(e)) {
+ reverseTable(e->atrs, sizeof(AtrElem));
+ reverseVrbs(e->vrbs);
+ reverseStms(e->art);
+ reverseStms(e->dscr1);
+ reverseStms(e->dscr2);
+ e++;
+ }
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseExts(Aword adr)
+#else
+static void reverseExts(adr)
+ Aword adr;
+#endif
+{
+ ExtElem *e = (ExtElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ExtElem));
+ while (!endOfTable(e)) {
+ if (!e->done) {
+ reverseChks(e->checks);
+ reverseStms(e->action);
+ }
+ e++;
+ }
+ }
+}
+
+#ifdef _PROTOTYPES_
+static void reverseLocs(Aword adr)
+#else
+static void reverseLocs(adr)
+ Aword adr;
+#endif
+{
+ LocElem *e = (LocElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(LocElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->nams);
+ reverseStms(e->dscr);
+ reverseStms(e->does);
+ reverseTable(e->atrs, sizeof(AtrElem));
+ reverseExts(e->exts);
+ reverseVrbs(e->vrbs);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseClas(Aword adr)
+#else
+static void reverseClas(adr)
+ Aword adr;
+#endif
+{
+ ClaElem *e = (ClaElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ClaElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->stms);
+ e++;
+ }
+ }
+ if (adr)
+ reverse(&((Aword *)e)[1]); /* The verb code is stored after the table */
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseElms(Aword adr)
+#else
+static void reverseElms(adr)
+ Aword adr;
+#endif
+{
+ ElmElem *e = (ElmElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(ElmElem));
+ while (!endOfTable(e)) {
+ if (e->code == EOS) reverseClas(e->next);
+ else reverseElms(e->next);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseStxs(Aword adr)
+#else
+static void reverseStxs(adr)
+ Aword adr;
+#endif
+{
+ StxElem *e = (StxElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(StxElem));
+ while (!endOfTable(e)) {
+ reverseElms(e->elms);
+ e++;
+ }
+ }
+}
+
+#ifdef _PROTOTYPES_
+static void reverseEvts(Aword adr)
+#else
+static void reverseEvts(adr)
+ Aword adr;
+#endif
+{
+ EvtElem *e = (EvtElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(EvtElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->code);
+ e++;
+ }
+ }
+}
+
+
+
+#ifdef _PROTOTYPES_
+static void reverseLims(Aword adr)
+#else
+static void reverseLims(adr)
+ Aword adr;
+#endif
+{
+ LimElem *e = (LimElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(LimElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->stms);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseCnts(Aword adr)
+#else
+static void reverseCnts(adr)
+ Aword adr;
+#endif
+{
+ CntElem *e = (CntElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(CntElem));
+ while (!endOfTable(e)) {
+ reverseLims(e->lims);
+ reverseStms(e->header);
+ reverseStms(e->empty);
+ reverseStms(e->nam);
+ e++;
+ }
+ }
+}
+
+
+#ifdef _PROTOTYPES_
+static void reverseRuls(Aword adr)
+#else
+static void reverseRuls(adr)
+ Aword adr;
+#endif
+{
+ RulElem *e = (RulElem *) &memory[adr];
+
+ if (adr != 0 && !endOfTable(e)) {
+ reverseTable(adr, sizeof(RulElem));
+ while (!endOfTable(e)) {
+ reverseStms(e->exp);
+ reverseStms(e->stms);
+ e++;
+ }
+ }
+}
+
+
+
+/*----------------------------------------------------------------------
+
+ reverseHdr()
+
+ Reverse the header structure.
+
+*/
+#ifdef _PROTOTYPES_
+void reverseHdr(AcdHdr *hdr)
+#else
+void reverseHdr(hdr)
+ AcdHdr *hdr;
+#endif
+{
+ int i;
+
+ /* Reverse all words in the header except the first (version marking) */
+ for (i = 1; i < sizeof(AcdHdr)/sizeof(Aword); i++)
+ reverse(&((Aword *)hdr)[i]);
+}
+
+/*----------------------------------------------------------------------
+
+ reverseACD()
+
+ Traverse all the data structures and reverse all integers.
+ Only performed in architectures with reversed byte ordering, which
+ makes the .ACD files fully compatible across architectures
+
+ */
+#ifdef _PROTOTYPES_
+void reverseACD(Boolean v2_5)
+#else
+void reverseACD(v2_5)
+ Boolean v2_5;
+#endif
+{
+ reverseHdr(header);
+ reverseWrds(header->dict);
+ reverseTable(header->oatrs, sizeof(AtrElem));
+ reverseTable(header->latrs, sizeof(AtrElem));
+ reverseTable(header->aatrs, sizeof(AtrElem));
+ reverseActs(header->acts);
+ reverseObjs(header->objs, v2_5);
+ reverseLocs(header->locs);
+ reverseStxs(header->stxs);
+ reverseVrbs(header->vrbs);
+ reverseEvts(header->evts);
+ reverseCnts(header->cnts);
+ reverseRuls(header->ruls);
+ reverseTable(header->init, sizeof(IniElem));
+ reverseStms(header->start);
+ reverseMsgs(header->msgs);
+
+ reverseTable(header->scores, sizeof(Aword));
+ reverseTable(header->freq, sizeof(Aword));
+}
+
+} // End of namespace Alan2
+} // End of namespace Glk