📄 gen.c
字号:
/* File gen.c: 2.1 (83/03/20,16:02:06) */
/*% cc -O -c %
*
*/
#include <stdio.h>
#include "defs.h"
#include "data.h"
#include "headers.h"
/*
* return next available internal label number
*
*/
int getlabel(void) {
int t;
t = nxtlab;
if (nxtlab + 1 > LABELCOUNTMAX - 1)
error("Too many labels");
else
nxtlab++;
return (t);
}
/*
* print specified number as label
*/
void printlabel(int label) {
olprfix();
outdec(label);
}
/*
* glabel - generate label
*/
void glabel(char *lab) {
LabPrefix();
outstr(lab);
col();
nl();
}
/*
* gnlabel - generate numeric label
*/
void gnlabel(int nlab) {
printlabel(nlab);
col();
nl();
}
char outbyte(char c) {
if (c == 0)
return (0);
fputc(c, output);
return (c);
}
void outstr(char *ptr) {
int k;
k = 0;
while (outbyte(ptr[k]))
k++;
}
void tab(void) {
outbyte(9);
}
void ol(char *ptr) {
ot(ptr);
nl();
}
void ot(char *ptr) {
tab();
outstr(ptr);
}
void outdec(int number) {
char ttt[50];
sprintf(ttt, "%d", number);
outstr(ttt);
}
void outundec(unsigned int number) {
char ttt[50];
sprintf(ttt, "%u", number);
outstr(ttt);
}
void store(STATE *stpt) {
if (stpt->storage == REGISTER)
putreg(stpt);
else
if (stpt->storage != AUTO)
putmem(stpt);
else
putstk(stpt, 0);
}
void rvalue(STATE *stpt) {
if (stpt->pointing && (symtab[stpt->ptr].reg & CONSTANT))
ld_constant(stpt);
else
if (stpt->storage == REGISTER)
getreg(stpt);
else
if (stpt->ident == FUNCTION)
gpop(CINT);
else
if (!stpt->pointing && stpt->storage != AUTO)
getmem(stpt);
else
indirect(stpt);
Check1Cast(stpt);
}
void test(int label, int ft) {
needbrack("(");
Emitting = rhs = RHSisPntr = 0;
JumpOutLabel = label;
SimplyTrue = TRUE;
IfFlag = 1;
expression(YES);
needbrack(")");
if (SimplyTrue) {
NoJump = TRUE;
testjump(label, ft, TheType);
}
ot("rjmp\t");
printlabel(label);
nl();
IfFlag = 0;
}
void backtest(int label, int ft) {
needbrack("(");
Emitting = rhs = RHSisPntr = 0;
JumpOutLabel = label;
SimplyTrue = TRUE;
IfFlag = 1;
expression(YES);
needbrack(")");
if (SimplyTrue) {
NoJump = TRUE;
testjump(label, ft, TheType);
}
ol("rjmp\t$+4");
ot("rjmp\t");
printlabel(label);
nl();
IfFlag = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -