home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
messroms.de
/
2007-01-13_www.messroms.de.zip
/
VZ200
/
TOOLS
/
ZCCSRC.ZIP
/
scc
/
sym.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-03-05
|
4KB
|
265 lines
/* File sym.c: 2.1 (83/03/20,16:02:19) */
/*% cc -O -c %
*
*/
#include <stdio.h>
#include "proto.h"
#include "defs.h"
#include "data.h"
/*
* declare a static variable
*/
void declglb(int typ, int stor)
{
int k, j;
char sname[NAMESIZE];
for (;;)
{
for (;;)
{
if (endst())
return;
k = 1;
if (match("*"))
j = POINTER;
else
j = VARIABLE;
if (!symname(sname))
illname();
if (findglb(sname))
multidef(sname);
if (match("["))
{
k = needsub();
if (k || stor == EXTERN)
j = ARRAY;
else
j = POINTER;
}
addglb(sname, j, typ, k, stor);
break;
}
if (!match(","))
return;
}
}
/*
* declare local variables
*
* works just like "declglb", but modifies machine stack and adds
* symbol table entry with appropriate stack offset to find it again
*/
void declloc(int typ, int stclass)
{
int k, j;
char sname[NAMESIZE];
for (;;)
{
for (;;)
{
if (endst())
return;
if (match("*"))
j = POINTER;
else
j = VARIABLE;
if (!symname(sname))
illname();
if (findloc(sname))
multidef(sname);
if (match("["))
{
k = needsub();
if (k)
{
j = ARRAY;
if (typ == CINT)
k = k * intsize();
}
else
{
j = POINTER;
k = intsize();
}
}
else
if (typ == CCHAR && j != POINTER)
k = 1;
else
k = intsize();
if (stclass != LSTATIC)
{
k = galign(k);
stkp = modstk(stkp - k);
addloc(sname, j, typ, stkp, AUTO);
}
else
addloc(sname, j, typ, k, LSTATIC);
break;
}
if (!match(","))
return;
}
}
/*
* get required array size
*/
int needsub(void)
{
int num[1];
if (match("]"))
return (0);
if (!cexpr(num))
{
error("must be constant");
num[0] = 1;
}
if (num[0] < 0)
{
error("negative size illegal");
num[0] = (-num[0]);
}
needbrack("]");
return (num[0]);
}
char *findglb(char *sname)
{
char *ptr;
ptr = STARTGLB;
while (ptr != glbptr)
{
if (astreq(sname, ptr, NAMEMAX))
return (ptr);
ptr = ptr + SYMSIZ;
}
return NULL;
}
char *findloc(char *sname)
{
char *ptr;
ptr = locptr;
while (ptr != STARTLOC)
{
ptr = ptr - SYMSIZ;
if (astreq(sname, ptr, NAMEMAX))
return (ptr);
}
return NULL;
}
char *addglb(char *sname, int id, int typ, int value, int stor)
{
char *ptr;
if (NULL!=(cptr = findglb(sname)))
return (cptr);
if (glbptr >= ENDGLB)
{
error("global symbol table overflow");
return (0);
}
cptr = ptr = glbptr;
while (an(*ptr++ = *sname++))
;
cptr[IDENT] = id;
cptr[TYPE] = typ;
cptr[STORAGE] = stor;
cptr[OFFSET] = value & 0xff;
cptr[OFFSET + 1] = (value >> 8) & 0xff;
glbptr = glbptr + SYMSIZ;
return (cptr);
}
char *addloc(char *sname, int id, int typ, int value, int stclass)
{
char *ptr;
int k;
if (NULL!=(cptr = findloc(sname)))
return (cptr);
if (locptr >= ENDLOC)
{
error("local symbol table overflow");
return (0);
}
cptr = ptr = locptr;
while (an(*ptr++ = *sname++))
;
cptr[IDENT] = id;
cptr[TYPE] = typ;
cptr[STORAGE] = stclass;
if (stclass == LSTATIC)
{
gbss();
printlabel(k = getlabel());
col();
defstorage();
onum(value);
nl();
gtext();
value = k;
}
else
value = galign(value);
cptr[OFFSET] = value & 0xff;
cptr[OFFSET + 1] = (value >> 8) & 0xff;
locptr = locptr + SYMSIZ;
return (cptr);
}
/*
* test if next input string is legal symbol name
*/
int symname(char *sname)
{
int k;
char c;
blanks();
if (!alpha(ch()))
return (0);
k = 0;
while (an(ch()))
{
c = gch();
if (k < NAMESIZE)
sname[k++] = c;
}
sname[k] = 0;
return (1);
}
void illname(void)
{
error("illegal symbol name");
}
void multidef(char *sname)
{
error("already defined");
comment();
outstr(sname);
nl();
}
int glint(char *syment)
{
int l, u, r;
l = syment[OFFSET];
u = syment[OFFSET + 1];
r = (l & 0xff) + ((u << 8) & ~0x00ff);
return (r);
}