1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2025-04-22 00:37:19 +00:00

Refactored Struct definition code

This commit is contained in:
Curtis F Kaylor 2018-03-08 09:39:32 -05:00
parent fd6a96afb5
commit f7f23059fe
4 changed files with 68 additions and 40 deletions

View File

@ -172,6 +172,7 @@ int main(int argc, char *argv[]) {
compile();
logstc();
logcon();
clssrc(); //Close Source File

View File

@ -230,9 +230,8 @@ void pincfl(void) {
/* Print Constant Table to Log File */
void logcon(void) {
int i;
fprintf(logfil, "\n%-31s %5s\n", "Definition", "Value");
for (i=0; i<concnt; i++)
{
fprintf(logfil, "%-31s %5d\n", connam[i], conval[i]);
fprintf(logfil, "\n%-10s %5s\n", "Constant", "Value");
for (i=0; i<concnt; i++) {
fprintf(logfil, "%-10s %5d\n", connam[i], conval[i]);
}
}

View File

@ -146,8 +146,8 @@ void addvar(int m, int t) {
}
else {
if (t == VTSTRUCT) {
DEBUG("Setting variable size to %d\n", stcsiz[stcidx])
sprintf(value, "%d", stcsiz[stcidx]);
DEBUG("Setting variable size to %d\n", strct.size)
sprintf(value, "%d", strct.size);
} else if (match('[')) {
skpchr();
if (alcvar) {
@ -210,7 +210,7 @@ void vartbl(void) {
int fndstc(char *name) {
DEBUG("Looking up struct '%s'\n", name)
for (stcidx=0; stcidx<stccnt; stcidx++)
if (strcmp(stcnam[stcidx], name) == 0) return TRUE;
if (strcmp(strcts[stcidx].name, name) == 0) return TRUE;
return FALSE;
}
@ -218,17 +218,18 @@ int fndstc(char *name) {
* Sets: stmidx = index into stmnam array *
* stmcnt if not found *
* Returns: TRUE if found, otherwise FALSE */
int fndstm(int stcidx, char *name) {
int fndmbr(int stcidx, char *name) {
DEBUG("Looking up member '%s'\n", word)
for (stmidx=0; stmidx<stmcnt; stmidx++)
if (stmstc[stmidx] != stcidx) continue;
if (strcmp(stmnam[stmidx], name) == 0) return TRUE;
for (mbridx=0; mbridx<mbrcnt; mbridx++)
if (membrs[mbridx].strcti != stcidx) continue;
if (strcmp(membrs[mbridx].name, name) == 0) return TRUE;
return FALSE;
}
/* Parse and Compile Struct Declaration */
void addstc(void) {
if (!fndstc(word)) ERROR("Undefined Struct '%s\n", word,EXIT_FAILURE)
strct = strcts[stcidx]; //Retrieve Structure
getwrd(); //Get Variable Name
addvar(MTNONE, VTSTRUCT);
expect(';');
@ -237,39 +238,55 @@ void addstc(void) {
/* Parse Struct Definition *
* Uses: word - Struct Name */
void defstc(void) {
DEBUG("Parsing Struct Definition\n", 0)
DEBUG("Parsing struct definition\n", 0)
if (fndstc(word)) ERROR("Duplicate Declaration of Struct '%s\n", word,EXIT_FAILURE)
strncpy(stcnam[stccnt], word, STCLEN);
DEBUG("Added struct '%s' ", word); DETAIL("at index %d\n", stccnt);
stclen = 0; //Initialize Struct Length
strncpy(strct.name, word, STCLEN);
DEBUG("Set struct name to '%s'\n", word);
strct.size = 0; //Initialize Struct Length
do {
getwrd(); //Get Member Name
if (wordis("CHAR")) getwrd(); //Skip Optional Type Declaration
if (fndstm(stccnt, word)) ERROR("Duplicate Declaration of Struct Member '%s\n", word,EXIT_FAILURE)
DEBUG("Adding member %s ", word) DETAIL("at index %d\n", stmcnt);
strncpy(stmnam[stmcnt], word, STMLEN);
if (fndmbr(stccnt, word)) ERROR("Duplicate Declaration of Struct Member '%s\n", word,EXIT_FAILURE)
DEBUG("Parsing member %s", word)
strncpy(membr.name, word, STMLEN); //Set Member Name
membr.strcti = stcidx; //Set Parent Struct Index
membr.offset = strct.size; //Set Offset into Struct
DEBUG("Checking for array definition\n", 0)
if (match('[')) {
skpchr();
stmtyp[stmcnt] = ARRAY;
membr.stype = ARRAY;
DEBUG("Parsing array size\n", 0)
stmsiz[stmcnt] = prsnum(0xFF) + 1;
membr.size = prsnum(0xFF) + 1;
expect(']');
}
else {
stmtyp[stmcnt] = VARIABLE;
stmsiz[stmcnt] = 1;
membr.stype = VARIABLE;
membr.size = 1;
}
DEBUG("Set member type to %d", stmtyp[stmcnt]) DETAIL(" and size to %d\n", stmsiz[stmcnt]);
stclen += stmsiz[stmcnt];
DEBUG("Set member type to %d", membr.stype) DETAIL(" and size to %d\n", membr.size);
DEBUG("Adding member at index %d\n", mbrcnt);
membrs[mbrcnt++] = membr;
strct.size += membr.size;
expect(';');
stmcnt++;
} while (!look('}'));
expect(';');
//set stcsiz[
if (stclen > 256) ERROR("Structure Size %d Exceeds Limit of 256 bytes.\n", stclen, EXIT_FAILURE);
stcsiz[stccnt] = stclen;
DEBUG("Set struct size to %d\n", stclen);
stccnt++;
DEBUG("Struct Declaration Completed\n", 0)
if (strct.size > 256) ERROR("Structure Size %d Exceeds Limit of 256 bytes.\n", strct.size, EXIT_FAILURE);
DEBUG("Adding struct with size %d\n", strct.size) DETAIL("at index %d\n", stccnt);
strcts[stccnt++] = strct;
}
/* Print Struc Tables to Log File */
void logstc(void) {
fprintf(logfil, "\n%-8s %5s\n", "Struct", "Size");
for (stcidx=0; stcidx<stccnt; stcidx++) {
fprintf(logfil, "%-8s %5d\n", strcts[stcidx].name, strcts[stcidx].size);
}
fprintf(logfil, "\n%-8s %-8s", "Struct", "Member");
fprintf(logfil, " %5s %6s %5s\n", "Type", "Offset", "Size");
for (mbridx=0; mbridx<mbrcnt; mbridx++) {
membr = membrs[mbridx];
fprintf(logfil, "%-8s %-8s", strcts[membr.strcti].name, membr.name);
fprintf(logfil, " %5d %6d %5d\n", membr.stype, membr.offset, membr.size);
}
}

View File

@ -13,18 +13,28 @@ int varidx; //Index into Variable Tables
char vrname[MAXVAR+1]; //Variable Name
int vrwrtn; //Variables Written Flag
char stcnam[MAXSTC+1][STCLEN+1]; //Structure Name Table
int stcsiz[MAXSTC+1]; //Structure Size Table
struct strctd { //Struct Definition
char name[STCLEN+1]; //Struct Name
int size; //Total Length of Struct
};
struct strctd strcts[MAXSTC+1]; //Table of Defined Structs
struct strctd strct; //Defined Struct
int stccnt; //Number of Structs Defined
int stcidx; //Index into Struct Tables
int stclen; //Size of Current Struct
char stmnam[MAXSTM+1][STCLEN+1]; //Structure Member Name Table
int stmstc[MAXSTM+1]; //Structure Member Parent Struct
char stmtyp[MAXVAR+1]; //Structure Member Variable Type
int stmsiz[MAXVAR+1]; //Structure Member Array Size
int stmcnt; //Number of Struct Members Defined
int stmidx; //Index into Struct Member Tables
struct membrd { //Struct Membetr Definition
char name[STMLEN+1]; //Member Name
int strcti; //Parent Struct Index
int stype; //Member Symbol Type
int offset; //Offset into Struct
int size; //Member Size
};
struct membrd membrs[MAXSTM+1]; //Table of Defined Members
struct membrd membr; //Defined Member
int mbrcnt; //Number of Struct Members Defined
int mbridx; //Index into Struct Member Tables
enum vtypes {VTVOID, VTCHAR, VTSTRUCT}; //Variable Types
@ -62,3 +72,4 @@ void reqvar(int alwary); //Require and Parse Variable Name
void setdat(); //Store variable data
void setvar(int m, int t); //Add Variable to Variable table
void vartbl(); //Create Variable Table
void logstc(void); //Print Struct Tables to Log File