|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 1588 (0x634) Types: TextFile Names: »rooms.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Adv/Compiler/rooms.c«
#include "advgen.h" static room rooms[MAXROOMS]; static int nrooms; int decl_room(sym, darkness, nbrs, desc, flag) symbol *sym; bool darkness; symbol **nbrs; char *desc; bool flag; { room *r; int i; switch (sym->s_type) { case S_ROOM: if (flag && rooms[sym->s_value].r_declared) { muldecl(sym->s_sym, "room"); } break; case S_UNKNOWN: sym->s_value = newroom(sym->s_sym); sym->s_type = S_ROOM; break; default: confdecl(sym->s_sym, "room", sym->s_type); break; } if (flag) { r = rooms+(sym->s_value); r->r_declared = 1; r->r_dark = darkness; r->r_desc = desc; for (i = 0; i < 6; i++) { r->r_neighbours[i] = (nbrs && nbrs[i]) ? decl_room(nbrs[i], FALSE, SPNULL, CNULL, FALSE) : 0; } } return sym->s_value; } static int newroom(s) char *s; { if (nrooms == MAXROOMS) { fatal("too many rooms"); } rooms[nrooms].r_name = s; return nrooms++; } void checkrooms() { int i; for (i=1; i<nrooms; i++) { if (!rooms[i].r_declared) { gramerror(FALSE, "warning: undeclared room %s", rooms[i].r_name); } } } void printrooms(f) FILE *f; { int i, d; fprintf(f, "%d\n", nrooms); for (i = 0; i < nrooms; i++) { for (d = 0; d < 6; d++) { if (rooms[i].r_neighbours[d]) { fprintf(f, "%c%d", "NSEWUD"[d], rooms[i].r_neighbours[d]); } } if (rooms[i].r_dark) { (void) putc('%', f); } fprintf(f, ":%s\n", rooms[i].r_desc); } } int firstroom() { return nrooms < 2 ? 0 : 1; }