1
/*----------------------------------------------------------------------*\
5
Handles all reversing of data
7
\*----------------------------------------------------------------------*/
16
/*----------------------------------------------------------------------
20
Return the reversed bytes in the Aword
24
Aword reversed(Aword w) /* IN - The ACODE word to swap bytes of */
27
Aword w; /* IN - The ACODE word to swap bytes of */
30
Aword s; /* The swapped ACODE word */
37
for (i = 0; i < sizeof(Aword); i++)
38
sp[sizeof(Aword)-1 - i] = wp[i];
45
void reverse(Aword *w) /* IN - The ACODE word to reverse bytes in */
48
Aword *w; /* IN - The ACODE word to reverse bytes in */
56
static void reverseTable(Aword adr, int len)
58
static void reverseTable(adr, len)
63
Aword *e = &memory[adr];
67
while (!endOfTable(e)) {
68
for (i = 0; i < len/sizeof(Aword); i++) {
77
static void reverseStms(Aword adr)
79
static void reverseStms(adr)
83
Aword *e = &memory[adr];
88
if (*e == ((Aword)C_STMOP<<28|(Aword)I_RETURN)) break;
95
static void reverseMsgs(Aword adr)
97
static void reverseMsgs(adr)
101
MsgElem *e = (MsgElem *) &memory[adr];
103
if (adr != 0 && !endOfTable(e)) {
104
reverseTable(adr, sizeof(MsgElem));
105
while (!endOfTable(e)) {
106
reverseStms(e->stms);
114
static void reverseWrds(Aword adr)
116
static void reverseWrds(adr)
120
WrdElem *e = (WrdElem *) &memory[adr];
122
if (adr != 0 && !endOfTable(e)) {
123
reverseTable(adr, sizeof(WrdElem));
124
while (!endOfTable(e)) {
125
if ((e->class & (1L<<WRD_SYN)) == 0) { /* Do not do this for synonyms */
126
reverseTable(e->adjrefs, sizeof(Aword));
127
reverseTable(e->nounrefs, sizeof(Aword));
135
static void reverseChks(Aword adr)
137
static void reverseChks(adr)
141
ChkElem *e = (ChkElem *) &memory[adr];
143
if (adr != 0 && !endOfTable(e)) {
144
reverseTable(adr, sizeof(ChkElem));
145
while (!endOfTable(e)) {
147
reverseStms(e->stms);
154
static void reverseAlts(Aword adr)
156
static void reverseAlts(adr)
160
AltElem *e = (AltElem *)&memory[adr];
162
if (adr != 0 && !endOfTable(e) && !e->done) {
163
reverseTable(adr, sizeof(AltElem));
165
while (!endOfTable(e)) {
166
reverseChks(e->checks);
167
reverseStms(e->action);
175
static void reverseVrbs(Aword adr)
177
static void reverseVrbs(adr)
181
VrbElem *e = (VrbElem *)&memory[adr];
183
if (adr != 0 && !endOfTable(e)) {
184
reverseTable(adr, sizeof(VrbElem));
185
while (!endOfTable(e)) {
186
reverseAlts(e->alts);
194
static void reverseSteps(Aword adr)
196
static void reverseSteps(adr)
200
StepElem *e = (StepElem *) &memory[adr];
202
if (adr != 0 && !endOfTable(e)) {
203
reverseTable(adr, sizeof(StepElem));
204
while (!endOfTable(e)) {
214
static void reverseScrs(Aword adr)
216
static void reverseScrs(adr)
220
ScrElem *e = (ScrElem *) &memory[adr];
222
if (adr != 0 && !endOfTable(e)) {
223
reverseTable(adr, sizeof(ScrElem));
224
while (!endOfTable(e)) {
225
reverseStms(e->dscr);
226
reverseSteps(e->steps);
234
static void reverseActs(Aword adr)
236
static void reverseActs(adr)
240
ActElem *e = (ActElem *) &memory[adr];
242
if (adr != 0 && !endOfTable(e)) {
243
reverseTable(adr, sizeof(ActElem));
244
while (!endOfTable(e)) {
246
reverseTable(e->atrs, sizeof(AtrElem));
247
reverseScrs(e->scradr);
248
reverseVrbs(e->vrbs);
249
reverseStms(e->dscr);
256
static void reverseObjs(Aword adr, Boolean v2_5)
258
static void reverseObjs(adr, v2_5)
260
Boolean v2_5; /* TRUE if it's a v2.5 format game */
263
ObjElem *e = (ObjElem *) &memory[adr];
264
ObjElem25 *e25 = (ObjElem25 *) &memory[adr];
267
if (adr != 0 && !endOfTable(e25)) {
268
reverseTable(adr, sizeof(ObjElem25));
269
while (!endOfTable(e25)) {
270
reverseTable(e25->atrs, sizeof(AtrElem));
271
reverseVrbs(e25->vrbs);
272
reverseStms(e25->dscr1);
273
reverseStms(e25->dscr2);
278
if (adr != 0 && !endOfTable(e)) {
279
reverseTable(adr, sizeof(ObjElem));
280
while (!endOfTable(e)) {
281
reverseTable(e->atrs, sizeof(AtrElem));
282
reverseVrbs(e->vrbs);
284
reverseStms(e->dscr1);
285
reverseStms(e->dscr2);
294
static void reverseExts(Aword adr)
296
static void reverseExts(adr)
300
ExtElem *e = (ExtElem *) &memory[adr];
302
if (adr != 0 && !endOfTable(e)) {
303
reverseTable(adr, sizeof(ExtElem));
304
while (!endOfTable(e)) {
306
reverseChks(e->checks);
307
reverseStms(e->action);
315
static void reverseLocs(Aword adr)
317
static void reverseLocs(adr)
321
LocElem *e = (LocElem *) &memory[adr];
323
if (adr != 0 && !endOfTable(e)) {
324
reverseTable(adr, sizeof(LocElem));
325
while (!endOfTable(e)) {
326
reverseStms(e->nams);
327
reverseStms(e->dscr);
328
reverseStms(e->does);
329
reverseTable(e->atrs, sizeof(AtrElem));
330
reverseExts(e->exts);
331
reverseVrbs(e->vrbs);
339
static void reverseClas(Aword adr)
341
static void reverseClas(adr)
345
ClaElem *e = (ClaElem *) &memory[adr];
347
if (adr != 0 && !endOfTable(e)) {
348
reverseTable(adr, sizeof(ClaElem));
349
while (!endOfTable(e)) {
350
reverseStms(e->stms);
355
reverse(&((Aword *)e)[1]); /* The verb code is stored after the table */
360
static void reverseElms(Aword adr)
362
static void reverseElms(adr)
366
ElmElem *e = (ElmElem *) &memory[adr];
368
if (adr != 0 && !endOfTable(e)) {
369
reverseTable(adr, sizeof(ElmElem));
370
while (!endOfTable(e)) {
371
if (e->code == EOS) reverseClas(e->next);
372
else reverseElms(e->next);
380
static void reverseStxs(Aword adr)
382
static void reverseStxs(adr)
386
StxElem *e = (StxElem *) &memory[adr];
388
if (adr != 0 && !endOfTable(e)) {
389
reverseTable(adr, sizeof(StxElem));
390
while (!endOfTable(e)) {
391
reverseElms(e->elms);
398
static void reverseEvts(Aword adr)
400
static void reverseEvts(adr)
404
EvtElem *e = (EvtElem *) &memory[adr];
406
if (adr != 0 && !endOfTable(e)) {
407
reverseTable(adr, sizeof(EvtElem));
408
while (!endOfTable(e)) {
409
reverseStms(e->code);
418
static void reverseLims(Aword adr)
420
static void reverseLims(adr)
424
LimElem *e = (LimElem *) &memory[adr];
426
if (adr != 0 && !endOfTable(e)) {
427
reverseTable(adr, sizeof(LimElem));
428
while (!endOfTable(e)) {
429
reverseStms(e->stms);
437
static void reverseCnts(Aword adr)
439
static void reverseCnts(adr)
443
CntElem *e = (CntElem *) &memory[adr];
445
if (adr != 0 && !endOfTable(e)) {
446
reverseTable(adr, sizeof(CntElem));
447
while (!endOfTable(e)) {
448
reverseLims(e->lims);
449
reverseStms(e->header);
450
reverseStms(e->empty);
459
static void reverseRuls(Aword adr)
461
static void reverseRuls(adr)
465
RulElem *e = (RulElem *) &memory[adr];
467
if (adr != 0 && !endOfTable(e)) {
468
reverseTable(adr, sizeof(RulElem));
469
while (!endOfTable(e)) {
471
reverseStms(e->stms);
479
/*----------------------------------------------------------------------
483
Reverse the header structure.
487
void reverseHdr(AcdHdr *hdr)
495
/* Reverse all words in the header except the first (version marking) */
496
for (i = 1; i < sizeof(AcdHdr)/sizeof(Aword); i++)
497
reverse(&((Aword *)hdr)[i]);
500
/*----------------------------------------------------------------------
504
Traverse all the data structures and reverse all integers.
505
Only performed in architectures with reversed byte ordering, which
506
makes the .ACD files fully compatible across architectures
510
void reverseACD(Boolean v2_5)
512
void reverseACD(v2_5)
517
reverseWrds(header->dict);
518
reverseTable(header->oatrs, sizeof(AtrElem));
519
reverseTable(header->latrs, sizeof(AtrElem));
520
reverseTable(header->aatrs, sizeof(AtrElem));
521
reverseActs(header->acts);
522
reverseObjs(header->objs, v2_5);
523
reverseLocs(header->locs);
524
reverseStxs(header->stxs);
525
reverseVrbs(header->vrbs);
526
reverseEvts(header->evts);
527
reverseCnts(header->cnts);
528
reverseRuls(header->ruls);
529
reverseTable(header->init, sizeof(IniElem));
530
reverseStms(header->start);
531
reverseMsgs(header->msgs);
533
reverseTable(header->scores, sizeof(Aword));
534
reverseTable(header->freq, sizeof(Aword));