1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2024-06-01 05:41:34 +00:00

Modified compiler to allow multiple include subdirecties

This commit is contained in:
Curtis F Kaylor 2019-03-29 19:09:41 -04:00
parent 33a19c7a87
commit 7252710f70
6 changed files with 55 additions and 41 deletions

View File

@ -51,7 +51,7 @@ void init(void) {
wrtofs[0] = 0; //Write Offset
xsnvar[0] = 0; //Assigned X Variable Name
ysnvar[0] = 0; //Assigned Y Variable Name
subdir[0] = 0; //Include Subdirectory
subcnt = 0; //Include Subdirectories
strcpy(incdir, "../include/");
}
@ -141,8 +141,10 @@ int popt(int arg, int argc, char *argv[]) {
DEBUG("Header Name set to '%s'\n", hdrnam)
break;
case 'S':
strcpy(subdir, optarg);
DEBUG("Header Name set to '%s'\n", hdrnam)
strcpy(subdir[subcnt], optarg);
DEBUG("subdir[%d] ", subcnt)
DEBUG("set to '%s'\n", subdir[subcnt])
subcnt++;
break;
default:
ERROR("Illegal option -%c\n", opt, EXIT_FAILURE)

View File

@ -14,6 +14,7 @@
#define MAXVAR 255 //Maximum Number of Variables
#define MAXTRM 16 //Maximum Terms in Stack
#define DATASPC 4096 //Space to Allocate for Variable Data
#define SUBMAX 4 //Maximum Number of Sub Directories
#define LABLEN 6 //Maximum Label Length
#define LABFMT "L_%04d" //Label Format
@ -66,7 +67,9 @@ char cmtasm[LINELEN]; //Assembly Language Comment Text
char hdrnam[FNAMLEN]; //Header File Name
char incdir[FNAMLEN]; //Include File Directory
char inpnam[FNAMLEN]; //Input File Name
char subdir[FNAMLEN]; //Include File SubDirectory
char subdir[SUBMAX][FNAMLEN]; //Include File SubDirectory
int subcnt; //Number of Include Directories
int subidx; //Index into subdir[]
int alcvar; //Allocate Variables Flag
int inblck; //Multiline Block Flag

View File

@ -77,17 +77,18 @@ void clslog(void) { fclose(logfil); }
* Uses: incnam - Include File Name *
* subnam - Include File Name (Subdirectory) *
* Sets: incfil - Include File Handle */
void opninc(void)
void opninc(int chksub)
{
if (subnam[0]) {
DEBUG("Attempting to open include file '%s'\n", subnam)
incfil = fopen(subnam, "r");
if (incfil == NULL) DEBUG("Open failed\n", 0)
else {
strcpy(incnam, subnam);
DEBUG("INCNAM set to '%s'\n", incnam);
subnam[0] = 0;
return;
if (chksub) {
for (subidx=0; subidx<subcnt; subidx++) {
DEBUG("Attempting to open include file '%s'\n", subnam[subidx])
incfil = fopen(subnam[subidx], "r");
if (incfil == NULL) DEBUG("Open failed\n", 0)
else {
strcpy(incnam, subnam[subidx]);
DEBUG("INCNAM set to '%s'\n", incnam);
return;
}
}
}

View File

@ -12,7 +12,7 @@ char srcnam[FNAMLEN]; //Source File Name
char outnam[FNAMLEN]; //Assembler File Name
char lognam[FNAMLEN]; //Log File Name
char incnam[FNAMLEN]; //Include File Name
char subnam[FNAMLEN]; //Include File Name (Subdirectory)
char subnam[SUBMAX][FNAMLEN]; //Include File Name (Subdirectory)
void opnsrc(); //Open Source File
void clssrc(); //Close Source File
@ -23,5 +23,5 @@ void clsout(); //Close Output File
void opnlog(); //Open Log File
void clslog(); //Close Log File
void opninc(); //Open Include File
void opninc(int chksub); //Open Include File
void clsinc(); //Close Include File

View File

@ -23,38 +23,46 @@
void pincnm(void) {
char dlmtr;
int inclen = 0;
int sublen = 0;
int sublen[SUBMAX];
skpspc();
dlmtr = getnxt();
if (dlmtr == '<') {
strcpy(incnam, incdir);
inclen = strlen(incnam);
if (subdir[0]) {
strcpy(subnam, incdir);
strcat(subnam, subdir);
sublen = strlen(subnam);
subnam[sublen++] = '/';
}
if (subcnt) {
for (subidx = 0; subidx < subcnt; subidx++) {
sublen[subidx] = 0;
strcpy(subnam[subidx], incdir);
strcat(subnam[subidx], subdir[subidx]);
sublen[subidx] = strlen(subnam[subidx]);
subnam[subidx][sublen[subidx]++] = '/';
}
dlmtr = '>';
}
}
else if (dlmtr != '"')
ERROR("Unexpected character '%c' after include\n", dlmtr, EXIT_FAILURE)
while (!match(dlmtr))
{
incnam[inclen++] = nxtchr;
if (sublen) subnam[sublen++] = nxtchr;
for (int subidx = 0; subidx < subcnt; subidx++) {
if (sublen[subidx]) subnam[subidx][sublen[subidx]++] = nxtchr;
}
skpchr();
}
skpchr(); //skip end dlmtr
incnam[inclen] = 0;
subnam[sublen] = 0;
DEBUG("Set INCNAM to '%s'\n", incnam);
DEBUG("Set SUBNAM to '%s'\n", subnam);
for (int subidx = 0; subidx < subcnt; subidx++) {
subnam[subidx][sublen[subidx]] = 0;
DEBUG("Set SUBNAM[%d] ", subidx)
DEBUG("to '%s'\n", subnam[subidx]);
}
}
/* Process assembly language include file */
void incasm(void) {
opninc();
void incasm(int chksub) {
opninc(chksub);
setcmt("======== Assembler File ");
addcmt(incnam);
addcmt(" =======");
@ -212,9 +220,9 @@ void rstsrc(void) {
}
/* Process header include file */
void inchdr(void) {
void inchdr(int chksub) {
savsrc(); //Save Source File Information
opninc(); //Open Include File
opninc(chksub); //Open Include File
setinc(); //Set Include File Information
skpchr();
while (TRUE)
@ -242,9 +250,9 @@ void phdrfl(void) {
if (hdrnam[0] == 0) return;
DEBUG("Processing Header '%s'\n", hdrnam)
setinm(".h02");
inchdr();
inchdr(TRUE);
setinm(".a02");
incasm();
incasm(FALSE);
}
/* Process include file */
@ -256,15 +264,15 @@ void pincfl(void) {
ERROR("Invalid include file name '%sn", incnam, EXIT_FAILURE)
}
if (strcmp(dot, ".a02") == 0)
incasm();
incasm(TRUE);
if (strcmp(dot, ".asm") == 0)
incasm();
incasm(TRUE);
else if (strcmp(dot, ".h02") == 0) {
inchdr(); //Process Header File
inchdr(TRUE); //Process Header File
dot = strrchr(incnam, '.'); //find extension
strcpy(dot, ".a02");
DEBUG("INCNAM set to '%s'\n", incnam)
incasm(); //Process Assembly File with Same Name
incasm(FALSE); //Process Assembly File with Same Name
}
else {
ERROR("Unrecognized include file extension '%s'\n'", dot, EXIT_FAILURE)

View File

@ -3,10 +3,10 @@
*************************************/
/* Variable Table */
char varnam[MAXVAR+1][VARLEN+1]; //Variable Name Table
char varmod[MAXVAR+1]; //Variable Modifier
char vartyp[MAXVAR+1]; //Variable Type
char varsiz[MAXVAR+1][4]; //Variable Array Size
char varnam[MAXVAR+1][VARLEN+1]; //Variable Name Table (string)
char varmod[MAXVAR+1]; //Variable Modifier (MTxxx)
char vartyp[MAXVAR+1]; //Variable Type (VTxxx)
char varsiz[MAXVAR+1][4]; //Variable Array Size (string)
char varstc[MAXVAR+1]; //Variable Struct Index
int varcnt; //Number of Variables in Table
int varidx; //Index into Variable Tables
@ -50,7 +50,7 @@ int dsize; //Total Data Length
enum dtypes {DTBYTE, DTSTR, DTARRY}; //Variable Data Types
/*Variable Modifier Types (Bit Mask) */
/* Variable Modifier Types (Bit Mask) */
#define MTNONE 0 //No Modifier
#define MTALS 1 //Alias
#define MTCONST 2 //Constant