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

@ -5842,11 +5842,10 @@ 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);
} }
@ -5870,21 +5869,17 @@ 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 */
} else {
if (sym->ident==iFUNCTN || sym->ident==iREFFUNC) { if (sym->ident==iFUNCTN || sym->ident==iREFFUNC) {
if ((sym->usage & uNATIVE)!=0) { if ((sym->usage & uNATIVE)!=0 && (sym->usage & uREAD)==0 && sym->addr>=0)
if ((sym->usage & uREAD)==0 && sym->addr>=0)
sym->addr=ntv_funcid++; sym->addr=ntv_funcid++;
}
p[curp]=sym->addr; p[curp]=sym->addr;
markusage(sym,uREAD); markusage(sym,uREAD);
} else { } else {
p[curp]=sym->addr; p[curp]=sym->addr;
markusage(sym,uREAD|uWRITTEN); markusage(sym,uREAD|uWRITTEN);
} /* if */ } /* if */
} /* if */
break; break;
default: default:
if ((char)tok=='-') { if ((char)tok=='-') {
@ -5901,11 +5896,10 @@ 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);
@ -5922,21 +5916,17 @@ 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 */
} /* if */
markusage(sym,uREAD|uWRITTEN); markusage(sym,uREAD|uWRITTEN);
p[curp]=sym->addr; p[curp]=sym->addr;
} /* if */
} while (++curp<size); } while (++curp<size);
} }
@ -5954,16 +5944,16 @@ 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);
} else {
if (sym->ident!=iVARIABLE) {
error(17,str); /* undefined symbol */ error(17,str); /* undefined symbol */
} /* if */
markusage(sym,uREAD); markusage(sym,uREAD);
p[0]=sym->addr; p[0]=sym->addr;
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 */
p[1]=val; p[1]=val;
outinstr(name,arraysize(p),p); outinstr(name,(sizeof p / sizeof p[0]),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,23 +6114,19 @@ 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(" .");
stgwrite(str); stgwrite(str);
stgwrite("\n"); stgwrite("\n");
code_idx+=opcodes(1)+opargs(1); code_idx+=opcodes(1)+opargs(1);
markusage(sym,uREAD); markusage(sym,uREAD);
} }
}
static EMIT_OPCODE emit_opcodelist[] = { static EMIT_OPCODE emit_opcodelist[] = {
{ 0, NULL, emit_noop }, { 0, NULL, emit_noop },
@ -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: