|
|
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 d
Length: 4708 (0x1264)
Types: TextFile
Names: »dstrans.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Insult/dstrans.c«
/* RCS Info: $Revision: $ on $Date: $
* $Source: $
* Copyright (c) 1985 Wayne A. Christopher
* Permission is granted to do anything with this code except sell it
* or remove this message.
* This routine takes the data structures which have been created by the
* parser and creates a file called "kaf.spec.c", with all the appropriate
* source in it. Each node in the structure is given a unique name, and
* all links between these are made explicit here. Also all nodes are
* linked together in a list, for the purpose of searching for names.
*/
#include "kafgraf.h"
#include "defs.h"
#include <stdio.h>
extern struct knode *hashtab[];
extern FILE *specp; /* The file to output to. */
int errp = 0;
dstrans()
{
struct knode *nt, *wk, *lf;
struct karc *tarc;
int a;
char *it; /* Temp char *. */
unsigned char b, phash(); /* For lookup of node names. */
char lastnode[32];
/* dumpdata(); Diagnostic. */
/* First we have to resolve all references to nodes. Match
* ka_toname with the apropriate lists of nodes.
*/
for (a = 0; a < HASHSIZE; a++) {
for (nt = hashtab[a]; nt != NULL; nt = nt->kn_nnt) {
for (wk = nt; wk != NULL; wk = wk->kn_next) {
for (tarc = wk->kn_arc; tarc != NULL; tarc = tarc->ka_narc) {
if (tarc->ka_type != KTNTERM)
tarc->ka_to = NULL;
else {
it = tarc->ka_toname;
b = phash(it);
lf = NULL;
for (lf = hashtab[b]; lf != NULL; lf = lf->kn_nnt)
if (!strcmp(it, lf->kn_nodename)) {
tarc->ka_to = lf;
break;
}
if (lf == NULL) {
fprintf(stderr, "Error: no such node: %s\n", it);
errp = 1;
}
}
}
}
}
}
if (errp) {
fprintf(stderr, "kafka aborted due to errors\n");
exit(1);
}
/* All references are cool now. The working data structure is now
* to be built, with the difference that there is no hashing involved
* as everything is held together by the arcs.
*/
strcpy(lastnode, "0");
for (a = 0; a < HASHSIZE; a++) {
for (nt = hashtab[a]; nt != NULL; nt = nt->kn_nnt) {
for (wk = nt; wk != NULL; wk = wk->kn_next) {
/* Write this node out. This is ugly... */
if (wk->kn_arc)
fprintf(specp, "extern struct kcarc _kka%d;\n",
wk->kn_arc->ka_arcnumber);
if (wk->kn_next)
fprintf(specp, "extern struct kknode _kkn%d;\n",
wk->kn_next->kn_nodenumber);
if (wk->kn_fnum)
fprintf(specp, "extern int _kkFunc%d();\n",
wk->kn_fnum);
fprintf(specp, "struct kknode _kkn%d = { ", wk->kn_nodenumber);
fprintf(specp, "%d, ", wk->kn_type);
if (wk->kn_nodename)
fprintf(specp, "\"%s\", ",
wk->kn_nodename);
else
fprintf(specp, "0, ");
if (wk->kn_arc)
fprintf(specp, "&_kka%d, ", wk->kn_arc->ka_arcnumber);
else
fprintf(specp, "0, ");
if (wk->kn_next)
fprintf(specp, "&_kkn%d, ", wk->kn_next->kn_nodenumber);
else
fprintf(specp, "0, ");
if (wk->kn_fnum)
fprintf(specp, "_kkFunc%d, ",
wk->kn_fnum);
else
fprintf(specp, "0, ");
fprintf(specp, "%s };\n", lastnode);
sprintf(lastnode, "&_kkn%d", wk->kn_nodenumber);
if (wk->kn_arc) {
for (tarc = wk->kn_arc; tarc != NULL; tarc = tarc->ka_narc) {
if (tarc->ka_to)
fprintf(specp, "extern struct kknode _kkn%d;\n",
tarc->ka_to->kn_nodenumber);
if (tarc->ka_narc)
fprintf(specp, "extern struct kcarc _kka%d;\n",
tarc->ka_narc->ka_arcnumber);
fprintf(specp, "struct kcarc _kka%d = { ",
tarc->ka_arcnumber);
fprintf(specp, "\"%s\", ", tarc->ka_toname);
if (tarc->ka_type == KTNTERM)
fprintf(specp, "&_kkn%d, ",
tarc->ka_to->kn_nodenumber);
else
fprintf(specp, "0, ");
if (tarc->ka_narc)
fprintf(specp, "&_kka%d };\n",
tarc->ka_narc->ka_arcnumber);
else /* Oops { */
fprintf(specp, "0 };\n");
}
}
}
}
}
fprintf(specp, "struct kknode *nodelist = %s;\n\n", lastnode);
/* All the necessary information for the structure is now in place. */
}
/* Diagnostic routine. */
dumpdata()
{
int hpos;
struct knode *nont, *rule;
struct karc *arc;
for (hpos = 0; hpos < HASHSIZE; hpos++) {
printf("Hashtab entry %d:\n", hpos);
if (hashtab[hpos] == NULL)
printf("\t(empty)\n");
else
for (nont = hashtab[hpos]; nont != NULL;
nont = nont->kn_nnt) {
printf("\tNonterminal: %s\n", nont->kn_nodename);
for (rule = nont; rule != NULL;
rule = rule->kn_next) {
printf("Rule: ");
for (arc = rule->kn_arc; arc != NULL;
arc = arc->ka_narc)
printf("%s ", arc->ka_toname);
putchar('\n');
}
}
}
}