emit/__emit: Code cleanup

This commit is contained in:
Daniel_Cortez 2017-10-26 23:29:29 +07:00
parent 2492d4793b
commit 06feab9224
3 changed files with 91 additions and 122 deletions

View File

@ -699,7 +699,7 @@ SC_FUNC void dec(value *lval);
SC_FUNC void jmp_ne0(int number); SC_FUNC void jmp_ne0(int number);
SC_FUNC void jmp_eq0(int number); SC_FUNC void jmp_eq0(int number);
SC_FUNC void outval(cell val,int newline); SC_FUNC void outval(cell val,int newline);
SC_FUNC void outinstr(const char *name, int nargs, ucell *args); SC_FUNC void outinstr(const char *name,int nargs,ucell *args);
/* function prototypes in SC5.C */ /* function prototypes in SC5.C */
SC_FUNC int error(int number,...); SC_FUNC int error(int number,...);

View File

@ -5833,24 +5833,23 @@ static void check_empty(const unsigned char *lptr)
/* verifies that the string contains only whitespace */ /* verifies that the string contains only whitespace */
while (*lptr<=' ' && *lptr!='\0') while (*lptr<=' ' && *lptr!='\0')
lptr++; lptr++;
if (*lptr!='\0'&&*lptr!='}') if (*lptr!='\0' && *lptr!='}')
error(38); /* extra characters on line */ error(38); /* extra characters on line */
} }
static void emit_invalid_token(int need_token, int current_token) static void emit_invalid_token(int need_token,int current_token)
{ {
char s[sNAMEMAX+ 2]; char s[sNAMEMAX+2];
extern char *sc_tokens[]; extern char *sc_tokens[];
if (current_token<tFIRST) { if (current_token<tFIRST)
sprintf(s,"%c",(char)current_token); sprintf(s,"%c",(char)current_token);
} else { else
strcpy(s,sc_tokens[current_token-tFIRST]); strcpy(s,sc_tokens[current_token-tFIRST]);
} /* if */
error(1,sc_tokens[tSYMBOL-tFIRST],s); error(1,sc_tokens[tSYMBOL-tFIRST],s);
} }
static void emit_param_num(char *name, ucell *p, int size) static void emit_param_num(char *name,ucell *p,int size)
{ {
char *str; char *str;
cell val; cell val;
@ -5861,7 +5860,7 @@ static void emit_param_num(char *name, ucell *p, int size)
int curp=0; int curp=0;
do { do {
switch (tok=lex(&val, &str)) { switch (tok=lex(&val,&str)) {
case tRATIONAL: case tRATIONAL:
case tNUMBER: case tNUMBER:
p[curp]=val; p[curp]=val;
@ -5870,20 +5869,16 @@ static void emit_param_num(char *name, ucell *p, int size)
sym=findloc(str); sym=findloc(str);
if (sym==NULL) if (sym==NULL)
sym=findglb(str,sSTATEVAR); sym=findglb(str,sSTATEVAR);
if (sym==NULL || (sym->ident!=iFUNCTN && sym->ident!=iREFFUNC && (sym->usage & uDEFINE)==0) || sym->ident==iLABEL) { if (sym==NULL || (sym->ident!=iFUNCTN && sym->ident!=iREFFUNC && (sym->usage & uDEFINE)==0) || sym->ident==iLABEL)
error(17,str); /* undefined symbol */ error(17,str); /* undefined symbol */
if (sym->ident==iFUNCTN || sym->ident==iREFFUNC) {
if ((sym->usage & uNATIVE)!=0 && (sym->usage & uREAD)==0 && sym->addr>=0)
sym->addr=ntv_funcid++;
p[curp]=sym->addr;
markusage(sym,uREAD);
} else { } else {
if (sym->ident==iFUNCTN || sym->ident==iREFFUNC) { p[curp]=sym->addr;
if ((sym->usage & uNATIVE)!=0) { markusage(sym,uREAD|uWRITTEN);
if ((sym->usage & uREAD)==0 && sym->addr>=0)
sym->addr=ntv_funcid++;
}
p[curp]=sym->addr;
markusage(sym,uREAD);
} else {
p[curp]=sym->addr;
markusage(sym,uREAD|uWRITTEN);
} /* if */
} /* if */ } /* if */
break; break;
default: default:
@ -5901,17 +5896,16 @@ static void emit_param_num(char *name, ucell *p, int size)
break; break;
} /* if */ } /* if */
} /* if */ } /* if */
if (tok<tFIRST) { if (tok<tFIRST)
sprintf(ival,"%c",(char)tok); sprintf(ival,"%c",(char)tok);
} else { else
strcpy(ival,sc_tokens[tok-tFIRST]); strcpy(ival,sc_tokens[tok-tFIRST]);
} /* if */
error(1,sc_tokens[tSYMBOL-tFIRST],ival); error(1,sc_tokens[tSYMBOL-tFIRST],ival);
} /* switch */ } /* switch */
} while (++curp < size); } while (++curp<size);
} }
static void emit_param_data(char *name, ucell *p, int size) static void emit_param_data(char *name,ucell *p,int size)
{ {
cell val; cell val;
char *str; char *str;
@ -5922,22 +5916,18 @@ static void emit_param_data(char *name, ucell *p, int size)
do { do {
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
sym=findloc(str); sym=findloc(str);
if (sym==NULL || sym->vclass!=sSTATIC) if (sym==NULL || sym->vclass!=sSTATIC)
sym=findglb(str,sGLOBAL); sym=findglb(str,sGLOBAL);
if (sym==NULL) { if (sym==NULL)
error(17,str); error(17,str); /* undefined symbol */
} else { if (sym->ident!=iVARIABLE)
if (sym->ident!=iVARIABLE) { error(17,str); /* undefined symbol */
error(17,str); /* undefined symbol */ markusage(sym,uREAD|uWRITTEN);
} /* if */ p[curp]=sym->addr;
markusage(sym,uREAD|uWRITTEN); } while (++curp<size);
p[curp]=sym->addr;
} /* if */
} while (++curp < size);
} }
static void OPHANDLER_CALL emit_noop(char *name) static void OPHANDLER_CALL emit_noop(char *name)
@ -5947,23 +5937,23 @@ static void OPHANDLER_CALL emit_noop(char *name)
static void OPHANDLER_CALL emit_parm0(char *name) static void OPHANDLER_CALL emit_parm0(char *name)
{ {
outinstr(name, 0, NULL); outinstr(name,0,NULL);
} }
static void OPHANDLER_CALL emit_parm1_num(char *name) static void OPHANDLER_CALL emit_parm1_num(char *name)
{ {
ucell p[1]; ucell p[1];
emit_param_num(name, p, arraysize(p)); emit_param_num(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm1_gvar(char *name) static void OPHANDLER_CALL emit_parm1_gvar(char *name)
{ {
ucell p[1]; ucell p[1];
emit_param_data(name, p, arraysize(p)); emit_param_data(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm1_lbl(char *name) static void OPHANDLER_CALL emit_parm1_lbl(char *name)
@ -5974,9 +5964,8 @@ static void OPHANDLER_CALL emit_parm1_lbl(char *name)
int tok; int tok;
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
sym=fetchlab(str); sym=fetchlab(str);
sym->usage|=uREAD; sym->usage|=uREAD;
outinstr(name,1,&sym->addr); outinstr(name,1,&sym->addr);
@ -5986,16 +5975,16 @@ static void OPHANDLER_CALL emit_parm2_num(char *name)
{ {
ucell p[2]; ucell p[2];
emit_param_num(name, p, arraysize(p)); emit_param_num(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm2_gvar(char *name) static void OPHANDLER_CALL emit_parm2_gvar(char *name)
{ {
ucell p[2]; ucell p[2];
emit_param_data(name, p, arraysize(p)); emit_param_data(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm2_gvar_num(char *name) static void OPHANDLER_CALL emit_parm2_gvar_num(char *name)
@ -6009,75 +5998,68 @@ static void OPHANDLER_CALL emit_parm2_gvar_num(char *name)
extern char *sc_tokens[]; extern char *sc_tokens[];
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
sym=findloc(str); sym=findloc(str);
if (sym==NULL || sym->vclass!=sSTATIC) if (sym==NULL || sym->vclass!=sSTATIC)
sym=findglb(str,sGLOBAL); sym=findglb(str,sGLOBAL);
if (sym==NULL) { if (sym==NULL || sym->ident!=iVARIABLE)
error(17,str); error(17,str); /* undefined symbol */
} else { markusage(sym,uREAD);
if (sym->ident!=iVARIABLE) { p[0]=sym->addr;
error(17,str); /* undefined symbol */ tok=lex(&val,&str);
} /* if */ if (tok!=tNUMBER)
markusage(sym,uREAD); emit_invalid_token(tNUMBER,tok);
p[0]=sym->addr; p[1]=val;
tok=lex(&val,&str); outinstr(name,(sizeof p / sizeof p[0]),p);
if (tok!=tNUMBER) {
emit_invalid_token(tNUMBER, tok);
} /* if */
p[1]=val;
outinstr(name,arraysize(p),p);
} /* if */
} }
static void OPHANDLER_CALL emit_parm3_num(char *name) static void OPHANDLER_CALL emit_parm3_num(char *name)
{ {
ucell p[3]; ucell p[3];
emit_param_num(name, p, arraysize(p)); emit_param_num(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm3_gvar(char *name) static void OPHANDLER_CALL emit_parm3_gvar(char *name)
{ {
ucell p[3]; ucell p[3];
emit_param_data(name, p, arraysize(p)); emit_param_data(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm4_num(char *name) static void OPHANDLER_CALL emit_parm4_num(char *name)
{ {
ucell p[4]; ucell p[4];
emit_param_num(name, p, arraysize(p)); emit_param_num(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm4_gvar(char *name) static void OPHANDLER_CALL emit_parm4_gvar(char *name)
{ {
ucell p[4]; ucell p[4];
emit_param_data(name, p, arraysize(p)); emit_param_data(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm5_num(char *name) static void OPHANDLER_CALL emit_parm5_num(char *name)
{ {
ucell p[5]; ucell p[5];
emit_param_num(name, p, arraysize(p)); emit_param_num(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_parm5_gvar(char *name) static void OPHANDLER_CALL emit_parm5_gvar(char *name)
{ {
ucell p[5]; ucell p[5];
emit_param_data(name, p, arraysize(p)); emit_param_data(name,p,(sizeof p / sizeof p[0]));
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),p);
} }
static void OPHANDLER_CALL emit_do_case(char *name) static void OPHANDLER_CALL emit_do_case(char *name)
@ -6094,18 +6076,15 @@ static void OPHANDLER_CALL emit_do_case(char *name)
stgwrite(" "); stgwrite(" ");
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tNUMBER) { if (tok!=tNUMBER)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
outval(val,FALSE); outval(val,FALSE);
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
sym=fetchlab(str); sym=fetchlab(str);
if (sym==NULL) { if (sym==NULL)
error(17,str); /* undefined symbol */ error(17,str); /* undefined symbol */
} /* if */
outval(sym->addr,FALSE); outval(sym->addr,FALSE);
stgwrite("\n"); stgwrite("\n");
code_idx+=opargs(2)+opcodes(0); code_idx+=opargs(2)+opcodes(0);
@ -6119,12 +6098,10 @@ static void OPHANDLER_CALL emit_do_lodb_strb(char *name)
extern char *sc_tokens[]; extern char *sc_tokens[];
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tNUMBER) { if (tok!=tNUMBER)
emit_invalid_token(tNUMBER, tok); emit_invalid_token(tNUMBER,tok);
} /* if */ if (val!=1 && val!=2 && val!=4)
if (val!=1 && val!=2 && val!=4) {
error(50); /* invalid range */ error(50); /* invalid range */
} /* if */
outinstr(name,1,&val); outinstr(name,1,&val);
} }
@ -6137,22 +6114,18 @@ static void OPHANDLER_CALL emit_do_call(char *name)
extern char *sc_tokens[]; extern char *sc_tokens[];
tok=lex(&val,&str); tok=lex(&val,&str);
if (tok!=tSYMBOL) { if (tok!=tSYMBOL)
emit_invalid_token(tSYMBOL, tok); emit_invalid_token(tSYMBOL,tok);
} /* if */
sym=findglb(str,sGLOBAL); sym=findglb(str,sGLOBAL);
if (sym==NULL) { if (sym==NULL)
error(12); /* invalid function call */ error(12); /* invalid function call */
} else { stgwrite("\t");
stgwrite("\t"); stgwrite(name);
stgwrite(name); stgwrite(" .");
stgwrite(" "); stgwrite(str);
stgwrite("."); stgwrite("\n");
stgwrite(str); code_idx+=opcodes(1)+opargs(1);
stgwrite("\n"); markusage(sym,uREAD);
code_idx+=opcodes(1)+opargs(1);
markusage(sym,uREAD);
}
} }
static EMIT_OPCODE emit_opcodelist[] = { static EMIT_OPCODE emit_opcodelist[] = {
@ -6354,36 +6327,32 @@ SC_FUNC void emit_parse_line(void)
int tok,len,i; int tok,len,i;
symbol *sym; symbol *sym;
char name[MAX_INSTR_LEN]; char name[MAX_INSTR_LEN];
extern char *sc_tokens[];
tok=tokeninfo(&val,&st); tok=tokeninfo(&val,&st);
if (tok==tSYMBOL || (tok > tMIDDLE && tok <= tLAST)) { if (tok==tSYMBOL || (tok>tMIDDLE && tok<=tLAST)) {
/* get the token length */ /* get the token length */
if (tok > tMIDDLE && tok <= tLAST) { if (tok>tMIDDLE && tok<=tLAST)
extern char *sc_tokens[];
len=strlen(sc_tokens[tok-tFIRST]); len=strlen(sc_tokens[tok-tFIRST]);
} else { else
len=strlen(st); len=strlen(st);
} /* if */
lptr-=len; lptr-=len;
for(i=0; i<sizeof(name) && (isalnum(*lptr) || *lptr=='.'); ++i,++lptr) { for(i=0; i<sizeof(name) && (isalnum(*lptr) || *lptr=='.'); ++i,++lptr)
name[i]=(char)tolower(*lptr); name[i]=(char)tolower(*lptr);
} /* for */
name[i]='\0'; name[i]='\0';
i=emit_findopcode(name,strlen(name)); i=emit_findopcode(name,strlen(name));
if (emit_opcodelist[i].name==NULL && *name!='\0') { if (emit_opcodelist[i].name==NULL && *name!='\0')
error(104,name); /* invalid assembler instruction */ error(104,name); /* invalid assembler instruction */
} /* if */
emit_opcodelist[i].func(name); emit_opcodelist[i].func(name);
check_empty(lptr); check_empty(lptr);
} else if (tok==tLABEL) { } else if (tok==tLABEL) {
if (!emit_block_parsing) { if (!emit_block_parsing)
error(38); /* extra characters on line */ error(38); /* extra characters on line */
} /* if */
sym=fetchlab(st); sym=fetchlab(st);
setlabel((int)sym->addr); setlabel((int)sym->addr);
sym->usage|=uDEFINE; sym->usage|=uDEFINE;
} /* if */ } /* if */
if ((emit_block_parsing && matchtoken('}')) || !emit_block_parsing) { if (!emit_block_parsing || matchtoken('}')) {
matchtoken(';'); matchtoken(';');
emit_block_parsing=FALSE; emit_block_parsing=FALSE;
} /* if */ } /* if */

View File

@ -1453,12 +1453,12 @@ static int hier2(value *lval)
cell val; cell val;
char* st; char* st;
if (!matchtoken('{')) if (!matchtoken('{'))
error(38); error(38); /* extra characters on line */
lex(&val,&st); lex(&val,&st);
lval->ident=iEXPRESSION; lval->ident=iEXPRESSION;
emit_parse_line(); emit_parse_line();
if (!matchtoken('}')) if (!matchtoken('}'))
error(38); error(38); /* extra characters on line */
return FALSE; return FALSE;
} /* case */ } /* case */
default: default: