mirror of
https://github.com/RevCurtisP/C02.git
synced 2024-11-25 06:31:25 +00:00
Added enhanced debug output for labels
This commit is contained in:
parent
25e95e4ec8
commit
e3c66fea0f
34
src/label.c
34
src/label.c
@ -19,15 +19,15 @@
|
|||||||
void addlab(char *name) {
|
void addlab(char *name) {
|
||||||
if (fndvar(name)) ERROR("Label %s conflicts with variable with same name", name, EXIT_FAILURE)
|
if (fndvar(name)) ERROR("Label %s conflicts with variable with same name", name, EXIT_FAILURE)
|
||||||
if (fndlab(name)) ERROR("Duplicate program label %s\n", name, EXIT_FAILURE)
|
if (fndlab(name)) ERROR("Duplicate program label %s\n", name, EXIT_FAILURE)
|
||||||
DEBUG("Adding Program Label %s ", name) DEBUG("at index %d\n", labcnt)
|
DEBUG("label.addlab: Adding Program Label %s ", name) DETAIL("at index %d\n", labcnt)
|
||||||
strcpy(labnam[labcnt++], name);
|
strcpy(labnam[labcnt++], name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int fndlab(char *name) {
|
int fndlab(char *name) {
|
||||||
DEBUG("Looking for Program Label %s\n", name)
|
DEBUG("label.fndlab: Looking for Program Label %s\n", name)
|
||||||
for (labidx=0; labidx<labcnt; labidx++)
|
for (labidx=0; labidx<labcnt; labidx++)
|
||||||
if (strcmp(labnam[labidx], name) == 0) return TRUE;
|
if (strcmp(labnam[labidx], name) == 0) return TRUE;
|
||||||
DEBUG("Label %s Not Found\n", name)
|
DEBUG("label.fndlab: Label %s Not Found\n", name)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,10 +51,10 @@ const char lblflg[] = {LFNONE, LFNONE, LFNONE, LFBGN, LFEND, LFBGN, LFEND, LFEND
|
|||||||
* (-1 if not found) */
|
* (-1 if not found) */
|
||||||
int lstlbl(int lbflag) {
|
int lstlbl(int lbflag) {
|
||||||
int i;
|
int i;
|
||||||
DEBUG("Searching for label flag %d\n", lbflag)
|
DEBUG("label.lstlbl: Searching for label flag %d\n", lbflag)
|
||||||
for (i = lblcnt - 1; i>-1; i--)
|
for (i = lblcnt - 1; i>-1; i--)
|
||||||
if (lblflg[lbltyp[i]] == lbflag) break;
|
if (lblflg[lbltyp[i]] == lbflag) break;
|
||||||
DEBUG("Search produced label index %d\n", i)
|
DEBUG("label.lstlbl: Search produced label index %d\n", i)
|
||||||
if (i>=0) strcpy(tmplbl, lblnam[i]);
|
if (i>=0) strcpy(tmplbl, lblnam[i]);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@ -66,9 +66,9 @@ void setblk(int blkflg) { lblblk[lblcnt-1] = blkflg; }
|
|||||||
* Assembly Language Code *
|
* Assembly Language Code *
|
||||||
* to word */
|
* to word */
|
||||||
void setlbl(char *lblset) {
|
void setlbl(char *lblset) {
|
||||||
DEBUG("Setting Label '%s'\n", lblset)
|
DEBUG("label.setlbl: Setting Label '%s'\n", lblset)
|
||||||
if (strlen(lblasm) > 0) {
|
if (strlen(lblasm) > 0) {
|
||||||
DEBUG("Emitting Label '%s'\n'", lblasm);
|
DEBUG("label.setlbl: Emitting Label '%s'\n'", lblasm);
|
||||||
asmlin("",""); //Emit Block End Label on it's own line
|
asmlin("",""); //Emit Block End Label on it's own line
|
||||||
}
|
}
|
||||||
if (strlen(lblset) > LBLLEN) ERROR("Label '%s' exceeds maximum size\n", word, EXIT_FAILURE)
|
if (strlen(lblset) > LBLLEN) ERROR("Label '%s' exceeds maximum size\n", word, EXIT_FAILURE)
|
||||||
@ -77,7 +77,7 @@ void setlbl(char *lblset) {
|
|||||||
|
|
||||||
/* Parse Program Label */
|
/* Parse Program Label */
|
||||||
void prslab(void) {
|
void prslab(void) {
|
||||||
DEBUG("Parsing Label '%s''\n", word)
|
DEBUG("label.prslab: Parsing Label '%s''\n", word)
|
||||||
addlab(word);
|
addlab(word);
|
||||||
CCMNT(nxtchr);
|
CCMNT(nxtchr);
|
||||||
skpchr(); //skip ':'
|
skpchr(); //skip ':'
|
||||||
@ -86,7 +86,7 @@ void prslab(void) {
|
|||||||
/* generate new label */
|
/* generate new label */
|
||||||
void newlbl(char* lbname) {
|
void newlbl(char* lbname) {
|
||||||
sprintf(lbname, LBLFMT, lblnxt++);
|
sprintf(lbname, LBLFMT, lblnxt++);
|
||||||
DEBUG("Generated new label '%s'\n", lbname)
|
DEBUG("label.newlbl: Generated new label '%s'\n", lbname)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check Label Contents *
|
/* Check Label Contents *
|
||||||
@ -101,23 +101,23 @@ void chklbl(char* lbname) {
|
|||||||
* if label is already set, returns that label *
|
* if label is already set, returns that label *
|
||||||
* else generates new label and sets it */
|
* else generates new label and sets it */
|
||||||
void reqlbl(char* lbname) {
|
void reqlbl(char* lbname) {
|
||||||
DEBUG("Requesting Label\n",0)
|
DEBUG("label.reqlbl: Requesting Label\n",0)
|
||||||
if (lblasm[0] == 0) {newlbl(lbname); setlbl(lbname);}
|
if (lblasm[0] == 0) {newlbl(lbname); setlbl(lbname);}
|
||||||
else {strcpy(lbname,lblasm); DEBUG("Found lblasm set to \"%s\"\n", lblasm)}
|
else {strcpy(lbname,lblasm); DEBUG("label.reqlbl: Found lblasm set to \"%s\"\n", lblasm)}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* End Function Block */
|
/* End Function Block */
|
||||||
void endfnc(void) {
|
void endfnc(void) {
|
||||||
DEBUG("Ending function definition with lsrtrn set to %d\n", lsrtrn)
|
DEBUG("label.endfnc: Ending function definition with lsrtrn set to %d\n", lsrtrn)
|
||||||
if (!lsrtrn) asmlin("RTS", "");
|
if (!lsrtrn) asmlin("RTS", "");
|
||||||
infunc = FALSE;
|
infunc = FALSE;
|
||||||
DEBUG("Set infunc to %d\n", infunc)
|
DEBUG("label.endfnc: Set infunc to %d\n", infunc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pop Label from Stack and Emit on Next Line */
|
/* Pop Label from Stack and Emit on Next Line */
|
||||||
int poplbl(void) {
|
int poplbl(void) {
|
||||||
int lbtype = lbltyp[--lblcnt];
|
int lbtype = lbltyp[--lblcnt];
|
||||||
DEBUG("Popped label type %d\n", lbtype)
|
DEBUG("label.poplbl: Popped label type %d\n", lbtype)
|
||||||
switch (lbtype) {
|
switch (lbtype) {
|
||||||
case LTFUNC: endfnc(); break; //Return From Subroutine
|
case LTFUNC: endfnc(); break; //Return From Subroutine
|
||||||
case LTDO: strcpy(loplbl, lblnam[lblcnt]); break;
|
case LTDO: strcpy(loplbl, lblnam[lblcnt]); break;
|
||||||
@ -134,7 +134,7 @@ int poplbl(void) {
|
|||||||
int toplbl(char *rtlbl) {
|
int toplbl(char *rtlbl) {
|
||||||
if (lblcnt) {
|
if (lblcnt) {
|
||||||
strcpy(rtlbl, lblnam[lblcnt-1]);
|
strcpy(rtlbl, lblnam[lblcnt-1]);
|
||||||
DEBUG("Found top label %s\n", rtlbl)
|
DEBUG("label.toplbl: Found top label %s\n", rtlbl)
|
||||||
return lbltyp[lblcnt-1];
|
return lbltyp[lblcnt-1];
|
||||||
}
|
}
|
||||||
rtlbl[0] = 0; //Clear Label
|
rtlbl[0] = 0; //Clear Label
|
||||||
@ -145,9 +145,9 @@ int toplbl(char *rtlbl) {
|
|||||||
* Args: lbltyp - Label type *
|
* Args: lbltyp - Label type *
|
||||||
* Uses: curlbl - Label to push */
|
* Uses: curlbl - Label to push */
|
||||||
void pshlbl(int lbtype, char* lbname) {
|
void pshlbl(int lbtype, char* lbname) {
|
||||||
DEBUG("Pushing label type %d\n", lbtype)
|
DEBUG("label.pshlbl: Pushing label type %d\n", lbtype)
|
||||||
strcpy(lblnam[lblcnt], lbname);
|
strcpy(lblnam[lblcnt], lbname);
|
||||||
lbltyp[lblcnt] = lbtype;
|
lbltyp[lblcnt] = lbtype;
|
||||||
lblblk[lblcnt++] = FALSE;
|
lblblk[lblcnt++] = FALSE;
|
||||||
DEBUG("Pushed label '%s' onto stack\n", lbname)
|
DEBUG("label.pshlbl: Pushed label '%s' onto stack\n", lbname)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user