DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T v

⟦9e53552b2⟧ TextFile

    Length: 3591 (0xe07)
    Types: TextFile
    Names: »vocab.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Adv/Compiler/vocab.c« 

TextFile

#include	"advgen.h"

static wordtable	noun_table = { 1, 1, 0, { { "--", NOTFOUND } } };
static wordtable	verb_table = { 1, 1, 0, { { "--", NOTFOUND } } };
static wordtable	*cur_table = WNULL;

void
set_nouns()
{
    cur_table = &noun_table;
}

void
set_verbs()
{
    cur_table = &verb_table;
}

void
addword(sym, incr)
    symbol	*sym;
    int		incr;
{
    void	toomanywords();
    int		i;
    bool	dup = FALSE;
    int		val = cur_table->wt_value + incr;
    char	*s = sym->s_sym;

    if (cur_table == WNULL)
    {
	addspecialword(s);
	return;
    }
    for (i = 0; i < cur_table->wt_size; i++)
    {
	if (equivalent(cur_table->wt_vocab[i].v_word, s))
	{
	    if (incr || cur_table->wt_value != cur_table->wt_vocab[i].v_value)
	    {
		gramerror(FALSE, "warning - '%s' is equivalent to '%s'", s,
				cur_table->wt_vocab[i].v_word);
		val = cur_table->wt_vocab[i].v_value;
	    }
	    dup = TRUE;
	    break;
	}
    }
    if (cur_table->wt_size == MAXVOCAB)
    {
	toomanywords();
    }
    if (!dup)
    {
	cur_table->wt_wcount++;
	if (incr != 0)
	{
	    cur_table->wt_value += incr;
	}
    }
    cur_table->wt_vocab[cur_table->wt_size].v_dup = dup;
    cur_table->wt_vocab[cur_table->wt_size].v_word = s;
    cur_table->wt_vocab[cur_table->wt_size].v_value = val;
    if (cur_table == &noun_table)
    {
	sym->s_noun = cur_table->wt_size++;
    }
    else
    {
	sym->s_verb = cur_table->wt_size++;
    }
}

static void
toomanywords()
{
    fatal("too many %ss", cur_table == &noun_table ? "noun" : "verb");
}

int
findnoun(s, flag)
    symbol	*s;
    bool	flag;
{
    int		val;

    if (s == SNULL)
    {
	return NOTFOUND;
    }
    else
    {
	val = s->s_noun;
	if (flag && val==0)
	{
	    gramerror(TRUE, "%s is not a noun", s->s_sym);
	    add_error();
	}
	return val == 0 ? NOTFOUND : noun_table.wt_vocab[val].v_value;
    }
}

int
findverb(s, flag)
    symbol	*s;
    bool	flag;
{
    int		val;

    if (s == SNULL)
    {
	return NOTFOUND;
    }
    else
    {
	val = s->s_verb;
	if (flag && val == 0)
	{
	    gramerror(TRUE, "%s is not a verb", s->s_sym);
	    add_error();
	}
	return val == 0 ? NOTFOUND : verb_table.wt_vocab[val].v_value;
    }
}

char *
noun_name(i)
    smallint	i;
{
    return noun_table.wt_vocab[i].v_word;
}

void
printvocab(f)
    FILE	*f;
{
    void	printtable();

    printtable(f, &verb_table);
    printtable(f, &noun_table);    
}

static void
printtable(f, table)
    FILE	*f;
    wordtable	*table;
{
    char	*upcase();
    int		i, count = 10, val = 0;
    
    fprintf(f, "%d", table->wt_wcount);
    for (i = 0; i < table->wt_size; i++)
    {
	if (table->wt_vocab[i].v_dup)
	{
	    continue;
	}
	if (count++ == 10)
	{
	    count = 0;
	    (void) putc('\n', f);
	}
	else
	{
	    (void) putc(',', f);
	}
	if (val == table->wt_vocab[i].v_value)
	{
	    (void) putc('*', f);
	}
	else
	{
	    val = table->wt_vocab[i].v_value;
	}
	fprintf(f, "%s", upcase(table->wt_vocab[i].v_word));
    }
    putc('\n', f);
}

#include	<ctype.h>

static char
up(c)
    char	c;
{
    return islower(c) ? toupper(c) : c;
}

static char *
upcase(s)
    char	*s;
{
    extern int	wsize;
    static char	image[500];
    char	*cp;

    (void) strncpy(image, s, wsize);
    image[wsize] = '\0';
    for (cp = image; *cp; cp++)
    {
	*cp = up(*cp);
    }
    return image;
}

static bool
equivalent(s1, s2)
    char	*s1;
    char	*s2;
{
    extern int	wsize;
    int		i;
    int		limit = wsize ? wsize : DEFWORDSIZE;

    for (i=0; i<limit; i++)
    {
	if (up(s1[i]) != up(s2[i]))
	{
	    return FALSE;
	}
	if (s1[i] == '\0')
	{
	    return TRUE;
	}
    }
    return TRUE;
}