0,0 → 1,461 |
// ---- ¥á¥¨¥ ¯®¨¬¥®¢ ®© ª®áâ âë ¢ ᯨ᮪ |
AddConstToTree(dword keystring,constvalue) |
dword ptr,newptr; // idrec structure |
{ |
newptr=LocalAlloc(0x40,recsize); |
IF(EAX==NULL){ |
preerror("Compiler out of memory for identifier tree"); |
ExitProcess(e_outofmemory); |
} |
ptr=treestart; |
IF(EAX == NULL ) // ãá⮩ ᯨ᮪? |
treestart = newptr; |
ELSE{ |
for(;;){ |
// ®¨áª ᢮¡®¤®© áá뫪¨ |
ESI=ptr; |
EAX=lstrcmpA(DSDWORD[ESI+recid],keystring); |
ESI=ptr; |
IF(long EAX<0){ |
// ptr.left |
IF(DSDWORD[ESI+left]==0){ // 諨 ¯ãá⮩ «¥¢ë© - ¤®¡ ¢¨¬ |
DSDWORD[ESI+left]=newptr; |
BREAK; // ptr.left=newptr |
} |
ptr=DSDWORD[ESI+left]; |
} |
ELSE IF(EAX!=0){ |
// ptr.right |
IF(DSDWORD[ESI+right]==0){ // 諨 ¯ãá⮩ ¯à ¢ë© - ¤®¡ ¢¨¬ |
DSDWORD[ESI+right]=newptr; |
BREAK; |
} |
ptr=DSDWORD[ESI+right]; |
} |
ELSE internalerror("string found in tree when trying to add to it"); |
} |
} |
// ®à¬¨à㥬 ®¢ãî § ¯¨áì ¢ ᯨ᪥ |
ESI=newptr; |
DSDWORD[ESI+recid]=LocalAlloc(0x40,lstrlenA(keystring)+1); |
lstrcpyA(DSDWORD[ESI+recid],keystring); |
ESI=newptr; |
DSDWORD[ESI+newid]= NULL; |
DSDWORD[ESI+rectok]=tk_number; |
DSDWORD[ESI+recnumber]=constvalue; |
DSDWORD[ESI+recpost]=0; |
DSDWORD[ESI+left]=NULL; |
DSDWORD[ESI+right]=NULL; |
DSDWORD[ESI+recmodline] = currmod<<16+linenumber; |
} |
|
// ---- ®¡ ¢¨âì «®ª «ìãî ¯¥à¥¬¥ãî ¢ ᯨ᮪ |
AddLocalvar(dword str,tk,ltype,num) |
dword newptr; |
{ |
newptr=LocalAlloc(0x40,local_size); |
IF(EAX==NULL){ |
preerror("Compiler out of memory for local symbol linked list"); |
ExitProcess(e_outofmemory); |
} |
IF(locallist==NULL)locallist = newptr; |
ELSE{ |
EAX=locallist; |
EBX><EAX; //ptr; |
for(;;){ |
EAX=DSDWORD[EBX+localnext]; |
IF(EAX==0)BREAK; |
EBX><EAX; |
} |
DSDWORD[EBX+localnext]=newptr; |
} |
EBX=newptr; |
lstrcpyA(EBX+localid,str); |
EBX=newptr; |
DSDWORD[EBX+localtok] = tk; |
DSDWORD[EBX+localtype] = ltype; |
DSDWORD[EBX+localnumber] = num; |
DSDWORD[EBX+localnext] = NULL; |
localptr=EBX; |
} |
|
// ---- ®¡ ¢¨âì ¨¤¥â¨ä¨ª â®à ¢ ᯨ᮪ |
AddToTree(dword keystring) |
dword ptr,newptr; |
{ |
newptr=LocalAlloc(0x40,recsize); |
IF(EAX==NULL)outofmemory(); |
ptr = treestart; |
//WRITESTR(keystring);WRITESTR("\n"); |
IF(EAX==NULL)treestart = newptr; |
ELSE{ |
for(;;){ |
// ®¨áª ᢮¡®¤®© áá뫪¨ |
ESI=ptr; |
EAX=lstrcmpA(DSDWORD[ESI+recid],keystring); |
ESI=ptr; |
IF(long EAX<0){ |
// ptr.left |
IF(DSDWORD[ESI+left]==0){ // 諨 ¯ãá⮩ «¥¢ë© - ¤®¡ ¢¨¬ |
DSDWORD[ESI+left]=newptr; |
BREAK; // ptr.left=newptr |
} |
ptr=DSDWORD[ESI+left]; |
} |
ELSE IF(EAX!=0){ |
// ptr.right |
IF(DSDWORD[ESI+right]==0){ // 諨 ¯ãá⮩ ¯à ¢ë© - ¤®¡ ¢¨¬ |
DSDWORD[ESI+right]=newptr; |
BREAK; |
} |
ptr=DSDWORD[ESI+right]; |
} |
ELSE internalerror("string found in tree when trying to add to it"); |
} |
} |
ESI=newptr; |
DSDWORD[ESI+recid]=LocalAlloc(0x40,lstrlenA(keystring)+1); |
lstrcpyA(EAX,keystring); |
IF(tok == tk_string){ |
ESI=newptr; |
DSDWORD[ESI+newid] = LocalAlloc(0x40,number+1); |
IF( EAX == NULL )outofmemory(); |
ECX=number; |
EDI=EAX; |
ESI=#string; |
$REP $MOVSB |
} |
ELSE{ |
IF( lstrlenA(#string) == 0 ){ |
ESI=newptr; |
DSDWORD[ESI+newid]=NULL; |
} |
ELSE{ |
ESI=newptr; |
DSDWORD[ESI+newid]=LocalAlloc(0x40,lstrlenA(#string)+1); |
IF( EAX == NULL )outofmemory(); |
lstrcpyA(EAX,#string); |
} |
} |
ESI=newptr; |
DSDWORD[ESI+rectok] = tok; |
DSDWORD[ESI+recnumber] = number; |
DSDWORD[ESI+rectype] = type; |
DSDWORD[ESI+recsrc] = src; |
DSDWORD[ESI+recpost] = post; |
DSDWORD[ESI+left] = NULL; |
DSDWORD[ESI+right] = NULL; |
DSDWORD[ESI+recmodline] = modline; |
treeptr = newptr; |
} |
|
// ---- 뢮¤ ¢á¥å ¨¤¥â¨ä¨ª â®à®¢ |
void DisplayTree () |
{ // dump all identifiers to MAP file |
fprint(mapfile,"ALL GLOBAL IDENTIFIERS LIST:\n"); |
fprint(mapfile,"tok type number post\tIDENTIFIER\n"); |
numberofids = 0; |
DisplayTreeAll(treestart); |
wsprintfA(#mapstr,"\n %u Unique Global Identifiers.\n\n",numberofids); |
fprint(mapfile,#mapstr); |
fprint(mapfile,"GLOBAL CONSTANT IDENTIFIER LIST:\n"); |
numberofids = 0; |
DisplayTreeConstants(treestart); |
wsprintfA(#mapstr,"\n %u Unique Global Constant Value Identifiers.\n\n",numberofids); |
fprint(mapfile,#mapstr); |
} |
|
// ---- 뢮¤ ¢á¥£® ᯨ᪠¨¤¥â¨ä¨ ªâ®à®¢ |
DisplayTreeAll(dword ptr) |
{ |
if( ptr != NULL ){ |
ESI=ptr; |
DisplayTreeAll(DSDWORD[ESI+right]); |
ESI=ptr; |
if(DSDWORD[ESI+rectok]-DSDWORD[ESI+recpost]!=tk_API){ |
wsprintfA(#mapstr,"%3d %8lXh %8lXh %6Xh\t%s\n",DSDWORD[ESI+rectok], |
DSDWORD[ESI+rectype],DSDWORD[ESI+recnumber],DSDWORD[ESI+recpost], |
DSDWORD[ESI+recid]); |
fprint(mapfile,#mapstr); |
EAX=DSDWORD[ESI+newid]; |
IF(EAX!=0){ |
IF(lstrcmpA(DSDWORD[ESI+recid],EAX) != 0 ){ |
ESI=ptr; |
wsprintfA(#mapstr,"Alias=%s\n",DSDWORD[ESI+newid]); |
fprint(mapfile,#mapstr); |
} |
} |
IF(list){ |
ESI=ptr; |
EAX=DSDWORD[ESI+recsrc]; |
IF(EAX!=0){ |
EBX=DSDWORD[ESI+recmodline]>>16; |
EAX=FILENAMESIZE*EBX+#modules; |
EBX=EAX; |
wsprintfA(#mapstr,"File:%s, line=%-d:\n%s\n",EBX, |
DSDWORD[ESI+recmodline]&0xFFFF,DSDWORD[ESI+recsrc]); |
fprint(mapfile,#mapstr); |
ESI=ptr; LocalFree(DSDWORD[ESI+recsrc]); // ᢮¡®¤¨¬ ¯ ¬ïâì |
DSDWORD[ESI+recsrc]=0; |
} |
} |
numberofids++; |
} |
ESI=ptr; |
DisplayTreeAll(DSDWORD[ESI+left]); |
} |
} |
|
// ---- 뢮¤ ᯨ᪠£«®¡ «ìëå ª®áâ â |
DisplayTreeConstants(dword ptr) |
{ |
IF( ptr != NULL ){ |
ESI=ptr; |
DisplayTreeConstants(DSDWORD[ESI+right]); |
ESI=ptr; |
EAX=DSDWORD[ESI+rectok]; |
IF(EAX == tk_number){ |
wsprintfA(#mapstr,"#define %10ld /* %8lX hex */ %s\n", |
DSDWORD[ESI+recnumber],DSDWORD[ESI+recnumber],DSDWORD[ESI+recid]); |
fprint(mapfile,#mapstr); |
numberofids++; |
} |
ESI=ptr; |
DisplayTreeConstants(DSDWORD[ESI+left]); |
} |
} |
|
// ---- ëç¨á«¥¨¥ § ç¥¨ï ¡¥§§ ª®¢® ª®áâ âë |
dword DoConstDwordMath() |
dword value; |
{ |
IF(tok == tk_minus){ |
NextTok(); |
IF(tok != tk_number){ |
numexpected(); |
return(0); |
} |
number = -number; |
} |
IF(tok != tk_number){ |
numexpected(); |
return(0); |
} |
value = number; |
while(tok2isopperand()){ |
NextTok(); |
IF(tok2!=tk_number)return(value); |
switch(tok){ |
case tk_minus: value -= number2; break; |
case tk_plus: value += number2; break; |
case tk_xor: value ^= number2; break; |
case tk_and: value &= number2; break; |
case tk_or: value |= number2; break; |
case tk_mod: value = value % number2; BREAK; |
case tk_div: value = value / number2; BREAK; |
case tk_mult: value = value * number2; BREAK; |
case tk_rr: value >>= number2; BREAK; |
case tk_ll: value <<= number2; BREAK; |
case tk_xorminus: value ^= -number2; BREAK; |
case tk_andminus: value &= -number2; BREAK; |
case tk_orminus: value |= -number2; BREAK; |
/* case(tok==tk_modminus) value %= -number2; |
case(tok==tk_divminus) value /= -number2; |
case(tok==tk_multminus) value *= -number2; */ |
case tk_rrminus: value >>= -number2; BREAK; |
case tk_llminus: value <<= -number2; BREAK; |
} |
NextTok(); |
} |
return(value); |
} |
|
// ---- ëç¨á«¥¨¥ § ç¥¨ï § ª®¢®© ª®áâ âë |
long DoConstMath() |
long value; |
{ |
IF(tok == tk_minus){ |
NextTok(); |
IF(tok != tk_number){ |
numexpected(); |
return(0); |
} |
number = -number; |
} |
IF(tok != tk_number){ |
numexpected(); |
return(0); |
} |
value = number; |
while(tok2isopperand()){ |
NextTok(); |
IF(tok2 != tk_number) return(value); |
switch(tok){ |
case tk_minus: value -= number2; break; |
case tk_plus: value += number2; break; |
case tk_xor: value ^= number2; break; |
case tk_and: value &= number2; break; |
case tk_or: value |= number2; break; |
case tk_mod: value = value % number2; BREAK; |
case tk_div: value = value / number2; BREAK; |
case tk_mult: value = value * number2; BREAK; |
case tk_rr: value >>= number2; BREAK; |
case tk_ll: value <<= number2; BREAK; |
case tk_xorminus: value ^= -number2; BREAK; |
case tk_andminus: value &= -number2; BREAK; |
case tk_orminus: value |= -number2; BREAK; |
/* case(tok==tk_modminus) value %= -number2; |
case(tok==tk_divminus) value /= -number2; |
case(tok==tk_multminus) value *= -number2; */ |
case tk_rrminus: value >>= -number2; BREAK; |
case tk_llminus: value <<= -number2; BREAK; |
} |
NextTok(); |
} |
return(value); |
} |
|
// ---- ëç¨á«¥¨¥ § ç¥¨ï § ª®¢®© ª®áâ âë |
long DoConstLongMath() |
long value; |
{ |
value=DoConstMath(); |
NextTok(); |
return(value); |
} |
|
// ---- «¥¤ãî騩 token - ®¯¥à æ¨ï? |
dword tok2isopperand() |
{ |
EAX=tok2; |
IF(EAX==tk_plus)||(EAX==tk_minus)||(EAX==tk_mult)||(EAX==tk_div)||(EAX==tk_mod)|| |
(EAX==tk_rr)||(EAX==tk_ll)||(EAX==tk_or)||(EAX==tk_and)||(EAX==tk_xor)|| |
(EAX==tk_divminus)||(EAX==tk_modminus)||(EAX==tk_multminus)||(EAX==tk_xorminus)|| |
(EAX==tk_orminus)||(EAX==tk_andminus)||(EAX==tk_llminus)||(EAX==tk_rrminus)return(1); |
return(0); |
} |
|
// ---- «¥¤ãî騩 token § ªàë¢ ¥â ¢ëà ¦¥¨¥? |
dword tok2notstopper () |
{ |
EAX=tok2; |
IF(EAX==tk_semicolon)||(EAX==tk_comma)||(EAX==tk_closebracket)|| |
(EAX==tk_openblock)EAX=0; |
ELSE EAX=1; |
} |
|
// ---- ®¨áª ¢ ᯨ᪥ «®ª «ìëå ¯¥à¥¬¥ëå |
SearchLocals(dword tok4,type4,string4,number4) |
{ |
if( locallist != NULL ){ |
localptr = locallist; |
S00: |
ESI=EAX; //localptr; |
lstrcmpA(string4,ESI+localid); |
ESI=localptr; |
IF(EAX==0){ // ¥à¥¬¥ ï ©¤¥ |
EBX=number4; |
DSDWORD[EBX]=DSDWORD[ESI+localnumber]; |
EBX=type4; |
DSDWORD[EBX]=DSDWORD[ESI+localtype]; |
EBX=tok4; |
EAX=DSDWORD[ESI+localtok]; |
DSDWORD[EBX]=EAX; |
IF(EAX==tk_local){ |
EBX=number4; |
DSDWORD[EBX]-=localsize; |
} |
ELSE IF(EAX==tk_param){ |
EBX=number4; |
EAX=DSDWORD[EBX]+4; |
DSDWORD[EBX]=EAX; |
IF(current_proc_type==cpt_far)DSDWORD[EBX]+=4; // move over seg on stack |
} |
ELSE IF(EAX!=tk_locallabel)&&(EAX!=tk_number)internalerror("Bad *tok4 value in SearchLocals"); |
} |
ELSE{ |
IF(DSDWORD[ESI+localnext]!=NULL){ |
localptr=DSDWORD[ESI+localnext]; |
$JMP S00 |
} |
} |
} |
} |
|
// ---- ®¨áª ¢ ᯨ᪥ £«®¡ «ìëå ¨¤¥â¨ä¨ª â®à®¢ |
dword SearchTree(dword tok4,type4,src4,post4,string4,number4) |
dword ptr; |
long cmpresult; |
{ |
cmpresult=123; |
ptr = treestart; |
// ®¨áª ᢮¡®¤®© áá뫪¨ |
for(;;){ |
ESI=EAX; |
IF(ESI==0){ |
treeptr=NULL; |
return(0); // Not found |
} |
cmpresult = lstrcmpA(DSDWORD[ESI+recid],string4); |
ESI=ptr; |
IF(cmpresult<0)ptr=DSDWORD[ESI+left]; |
ELSE IF(cmpresult>0)ptr=DSDWORD[ESI+right]; |
ELSE BREAK; |
} |
EBX=number4; DSDWORD[EBX]=DSDWORD[ESI+recnumber]; |
EBX=type4; DSDWORD[EBX]=DSDWORD[ESI+rectype]; |
EBX=src4; DSDWORD[EBX]=DSDWORD[ESI+recsrc]; |
EBX=post4; DSDWORD[EBX]=DSDWORD[ESI+recpost]; |
EBX=tok4; EAX=DSDWORD[ESI+rectok]; DSDWORD[EBX]=EAX; |
IF(EAX==tk_string ){ |
EBX=number4; ECX=DSDWORD[EBX]; EDI=string4; |
ESI=DSDWORD[ESI+newid]; $REP $MOVSB |
} |
ELSE{ |
IF(DSDWORD[ESI+newid])lstrcpyA(string4,DSDWORD[ESI+newid]); |
} |
ESI=ptr; |
IF(lstrcmpA(DSDWORD[ESI+recid],string4)!=0) // ஢¥à¨¬: ¬¥ï«®áì «¨ ¨¬ï ¨¤¥â¨ä¨ª â®à |
SearchTree(tok4,type4,src4,post4,string4,number4); // - ¯®¢â®à¨¬ ¯®¨áª |
treeptr = ptr; |
return(1); |
} |
|
// ---- ®¨áª ¥®âª®¬¯¨«¨à®¢ ëå ¥é¥ ááë«®ª |
dword SeekToDo(dword ptr) |
{ |
IF(ptr!=NULL){ |
ESI=ptr; |
IF(SeekToDo(DSDWORD[ESI+right]))RETURN(1); |
ESI=ptr; EAX=DSDWORD[ESI+recpost]; |
IF(EAX>1){ |
treeptr=ptr; ESI=ptr; |
number=DSDWORD[ESI+recnumber]; |
type=DSDWORD[ESI+rectype]; modline=DSDWORD[ESI+recmodline]; |
src=DSDWORD[ESI+recsrc]; |
post=DSDWORD[ESI+recpost]; |
tok=DSDWORD[ESI+rectok]; RETURN(1); |
} |
ESI=ptr; |
IF(SeekToDo(DSDWORD[ESI+left]))RETURN(1); |
} |
return(0); |
} |
|
// ---- ®¨áª ¥§ ªàëâëå ááë«®ª |
SeekUndefined(dword ptr) |
{ |
IF( ptr != NULL ){ |
ESI=ptr; |
SeekUndefined(DSDWORD[ESI+right]); |
ESI=ptr; EAX=DSDWORD[ESI+rectok]; |
IF(EAX==tk_undefproc){ |
wsprintfA(#mapstr,"'%s' undefined\n",DSDWORD[ESI+recid]); |
IF( makemapfile )fprint(mapfile,#mapstr); |
WRITESTR(#mapstr); |
} |
ESI=ptr; |
SeekUndefined(DSDWORD[ESI+left]); |
} |
} |
|