mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-09-27 14:56:27 +00:00
Modified compiler to allow multiple include subdirecties
This commit is contained in:
parent
33a19c7a87
commit
7252710f70
@ -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)
|
||||
|
@ -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
|
||||
|
21
src/files.c
21
src/files.c
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
10
src/vars.h
10
src/vars.h
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user