2016-06-13 04:07:22 +02:00
# define _TOKE_
# include <fcntl.h>
# include <unistd.h>
# include "tok.h"
unsigned char gotoendif = FALSE ;
unsigned char atex = FALSE ;
unsigned char usedirectiv = TRUE ; //<2F> <> <EFBFBD> <EFBFBD> <20> <> ࠡ<EFBFBD> ⪠ <20> <> ४⨢<E0A5AA>
unsigned char parsecommandline = 0 ; // parse command line flag
unsigned char sdp_mode = FALSE ; //० <> <E0A5A6> <20> ਭ㤨⥫쭮<E2A5AB> <20> <> <EFBFBD> <EFBFBD> 㧪<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ᪨<EFBFBD> <20> <> <EFBFBD> 楤<EFBFBD> <E6A5A4>
unsigned int startexit ;
extern int maxerrors ; // number of errors to stop at
unsigned int postnumflag ; //䫠<> <20> <> <EFBFBD> <E1ABA5> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 䨪<EFBFBD> <E4A8AA> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <E1ABA5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
int calcnumber = FALSE ;
char mesmain [ ] = " main " ;
char * macroname [ ] = { " inp " , " inportb " , " inport " , " inportd " , " outp " , " outportb " ,
" outport " , " outportd " , " sqrt " , " cos " , " sin " , " atan2 " ,
" tan " , " log " , " log10 " , " exp " , " atan " , " fabs " , NULL } ;
enum { m_ib , m_ibt , m_iw , m_id , m_ob , m_obt , m_ow , m_od , m_sqrt , m_cos , m_sin , m_atan2 ,
m_tan , m_log , m_log10 , m_exp , m_atan , m_fabs , m_end } ;
int FindProcLib ( int ) ;
int RetAtExit ( ) ;
int ConvRetCode ( int i ) ;
int CompConst ( int firstval ) ;
int dirmode ;
# define NUMIFDEF 32 //<2F> <> <EFBFBD> ᨬ<EFBFBD> <E1A8AC> 쭠<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ४⨢ ifdef/ifndef
int endifcount = - 1 ; // depth count of ?if
char ujo [ ] = " Unknown #jumptomain option " ;
char toelse [ ] = " #else use once in #if " ;
char ido [ ] = " Unknown #inline option " ;
unsigned char startuptomain = FALSE ;
unsigned char dosstring = FALSE ;
unsigned char useelse [ NUMIFDEF ] ; //䫠<> <E4ABA0> <20> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ४⨢<E0A5AA> else
unsigned char jumptomain = CALL_NEAR ; // jump to the main()
unsigned char resizemem = 1 ; // set owned memory block to 64K
unsigned char fargc = FALSE ;
unsigned int startptrdata = 0x100 ; // data start address
unsigned int resizesizeaddress ; /* location of resize memory size descr. */
unsigned int stackstartaddress ; /* location of SP assignment */
/*-----------------18.09.98 23:20-------------------
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SYS
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
char sysname [ 8 ] = " NO_NAME " ;
int sysatr = 0x2000 ;
int sysstack = 0 ;
int sysnumcom = 0 ;
int syscom ;
//<2F> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 樨 rom-bios
int unsigned romsize = 0 ;
int dataromstart , dataromsize ;
int dataseg = 0x70 ;
unsigned int numdomain = 0 ; //<2F> <> <20> <> <EFBFBD> 楤<EFBFBD> <E6A5A4> <20> <> <EFBFBD> <EFBFBD> ᪠<EFBFBD> <E1AAA0> <EFBFBD> <EFBFBD> <20> <> main
char * domain ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> 楤<EFBFBD> <E6A5A4> <20> <> <EFBFBD> <EFBFBD> ᪠<EFBFBD> <E1AAA0> <EFBFBD> <EFBFBD> <20> <> main
int ifdefconst ( ) ;
void CheckNumIF ( ) ;
void KillVarOfTree ( idrec * * treestart ) ;
void IncludeFile ( char * fileincl , int tfind ) ;
char * pragmalist [ ] = { " option " , " line " , " startup " , " resource " , " pack " , " debug " , " indexregs " , " " } ;
enum { p_op , p_li , p_st , p_re , p_pa , p_db , p_idx , p_end } ;
int strpackdef = 1 ;
int strpackcur = 1 ;
struct STACKALIGN {
STACKALIGN * prev ;
int size ;
char id [ IDLENGTH ] ;
} ;
# ifdef DEBUGMODE
int debug = FALSE ;
# endif
STACKALIGN * stackalign = NULL ;
/* -------------- constant math procedures start --------------- */
int calcqwordnumber ( unsigned long long * retnum , unsigned long long number , int operand )
{
unsigned long long value ;
value = * retnum ;
switch ( operand ) {
case tk_minus : value - = number ; break ;
case tk_plus : value + = number ; break ;
case tk_xor : value ^ = number ; break ;
case tk_and : value & = number ; break ;
case tk_or : value | = number ; break ;
case tk_mod : value % = number ; break ;
case tk_div : value / = number ; break ;
case tk_mult : value * = number ; break ;
case tk_rr : value > > = number ; break ;
case tk_ll : value < < = number ; break ;
case tk_xorminus : value ^ = - number ; break ;
case tk_andminus : value & = - number ; break ;
case tk_orminus : value | = - number ; break ;
case tk_modminus : value % = - number ; break ;
case tk_divminus : value / = - number ; break ;
case tk_multminus : value * = - number ; break ;
case tk_rrminus : value > > = - number ; break ;
case tk_llminus : value < < = - number ; break ;
default : return FALSE ;
}
* retnum = value ;
return TRUE ;
}
unsigned long long doconstqwordmath ( )
{
unsigned long long value ;
unsigned int htok ;
int fundef ; //䫠<> <20> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
CheckMinusNum ( ) ;
if ( tok ! = tk_number ) {
numexpected ( ) ;
return ( 0 ) ;
}
if ( itok . rm = = tk_float ) value = * ( float * ) & itok . number ;
else if ( itok . rm = = tk_double ) value = * ( double * ) & itok . lnumber ;
else value = itok . lnumber ;
fundef = itok . rm ;
postnumflag = itok . flag ;
// usedirectiv=TRUE;
calcnumber = TRUE ;
while ( itok2 . type = = tp_opperand ) {
if ( fundef = = tk_undefofs & & tok2 ! = tk_plus & & tok2 ! = tk_minus ) break ;
nexttok ( ) ;
htok = tok ;
if ( tok2 ! = tk_number ) {
if ( tok2 ! = tk_dollar & & tok2 ! = tk_not ) {
calcnumber = FALSE ;
return ( value ) ;
}
nexttok ( ) ;
if ( tok ! = tk_number ) {
calcnumber = FALSE ;
return ( value ) ;
}
}
else nexttok ( ) ;
if ( itok . rm = = tk_float ) itok . number = * ( float * ) & itok . number ;
else if ( itok . rm = = tk_double ) itok . lnumber = * ( double * ) & itok . lnumber ;
if ( calcqwordnumber ( & value , itok . lnumber , htok ) = = FALSE ) beep ( ) ;
postnumflag ^ = itok . flag ;
}
nexttok ( ) ;
calcnumber = FALSE ;
return ( value ) ;
}
int calcdwordnumber ( unsigned long * retnum , unsigned long number , int operand )
{
unsigned long value ;
value = * retnum ;
switch ( operand ) {
case tk_minus : value - = number ; break ;
case tk_plus : value + = number ; break ;
case tk_xor : value ^ = number ; break ;
case tk_and : value & = number ; break ;
case tk_or : value | = number ; break ;
case tk_mod : value % = number ; break ;
case tk_div : value / = number ; break ;
case tk_mult : value * = number ; break ;
case tk_rr : value > > = number ; break ;
case tk_ll : value < < = number ; break ;
case tk_xorminus : value ^ = - number ; break ;
case tk_andminus : value & = - number ; break ;
case tk_orminus : value | = - number ; break ;
case tk_modminus : value % = - number ; break ;
case tk_divminus : value / = - number ; break ;
case tk_multminus : value * = - number ; break ;
case tk_rrminus : value > > = - number ; break ;
case tk_llminus : value < < = - number ; break ;
default : return FALSE ;
}
* retnum = value ;
return TRUE ;
}
unsigned long doconstdwordmath ( )
{
unsigned long value ;
unsigned int htok ;
int fundef ; //䫠<> <20> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
CheckMinusNum ( ) ;
if ( tok ! = tk_number ) {
numexpected ( ) ;
return ( 0 ) ;
}
if ( itok . rm = = tk_float ) value = * ( float * ) & itok . number ;
else value = itok . number ;
fundef = itok . rm ;
postnumflag = itok . flag ;
// usedirectiv=TRUE;
calcnumber = TRUE ;
while ( itok2 . type = = tp_opperand ) {
if ( fundef = = tk_undefofs & & tok2 ! = tk_plus & & tok2 ! = tk_minus ) break ;
nexttok ( ) ;
htok = tok ;
if ( tok2 ! = tk_number ) {
if ( tok2 ! = tk_dollar & & tok2 ! = tk_not ) {
calcnumber = FALSE ;
return ( value ) ;
}
nexttok ( ) ;
if ( tok ! = tk_number ) {
calcnumber = FALSE ;
return ( value ) ;
}
}
else nexttok ( ) ;
if ( itok . rm = = tk_float ) itok . number = * ( float * ) & itok . number ;
if ( itok . rm = = tk_double ) itok . number = * ( double * ) & itok . lnumber ;
if ( calcdwordnumber ( & value , itok . number , htok ) = = FALSE ) beep ( ) ;
postnumflag ^ = itok . flag ;
}
nexttok ( ) ;
calcnumber = FALSE ;
return ( value ) ;
}
int calclongnumber ( long * retnum , long number , int operand )
{
long value ;
value = * retnum ;
switch ( operand ) {
case tk_minus : value - = number ; break ;
case tk_plus : value + = number ; break ;
case tk_xor : value ^ = number ; break ;
case tk_and : value & = number ; break ;
case tk_or : value | = number ; break ;
case tk_mod : value % = number ; break ;
case tk_div : value / = number ; break ;
case tk_mult : value * = number ; break ;
case tk_rr : value > > = number ; break ;
case tk_ll : value < < = number ; break ;
case tk_xorminus : value ^ = - number ; break ;
case tk_andminus : value & = - number ; break ;
case tk_orminus : value | = - number ; break ;
case tk_modminus : value % = - number ; break ;
case tk_divminus : value / = - number ; break ;
case tk_multminus : value * = - number ; break ;
case tk_rrminus : value > > = - number ; break ;
case tk_llminus : value < < = - number ; break ;
default : return FALSE ;
}
* retnum = value ;
return TRUE ;
}
signed long doconstlongmath ( )
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <E1ABA8> <20> <> ࠦ<EFBFBD> <E0A0A6> <EFBFBD> <EFBFBD>
{
long value ;
unsigned int htok ;
int fundef ; //䫠<> <20> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
CheckMinusNum ( ) ;
if ( tok ! = tk_number ) {
numexpected ( ) ;
return ( 0 ) ;
}
fundef = itok . rm ;
if ( itok . rm = = tk_float ) value = * ( float * ) & itok . number ;
else value = itok . number ;
// value=itok.number;
postnumflag = itok . flag ;
// usedirectiv=TRUE;
calcnumber = TRUE ;
while ( itok2 . type = = tp_opperand ) { //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ࠭<EFBFBD>
if ( fundef = = tk_undefofs & & tok2 ! = tk_plus & & tok2 ! = tk_minus ) break ;
nexttok ( ) ;
// printf("tok=%d tok2=%d\n",tok,tok2);
htok = tok ;
if ( tok2 ! = tk_number ) {
if ( tok2 ! = tk_dollar & & tok2 ! = tk_not ) {
calcnumber = FALSE ;
return ( value ) ;
}
nexttok ( ) ;
if ( tok ! = tk_number ) {
calcnumber = FALSE ;
return ( value ) ;
}
}
else nexttok ( ) ;
if ( itok . rm = = tk_float ) itok . number = * ( float * ) & itok . number ;
if ( itok . rm = = tk_double ) itok . number = * ( double * ) & itok . lnumber ;
if ( calclongnumber ( & value , itok . number , htok ) = = FALSE ) beep ( ) ;
postnumflag ^ = itok . flag ;
}
nexttok ( ) ;
calcnumber = FALSE ;
return ( value ) ;
}
int calcfloatnumber ( float * retnum , float number , int operand )
{
float value ;
value = * retnum ;
switch ( operand ) {
case tk_minus : value - = number ; break ;
case tk_plus : value + = number ; break ;
case tk_div : value / = number ; break ;
case tk_mult : value * = number ; break ;
case tk_divminus : value / = - number ; break ;
case tk_multminus : value * = - number ; break ;
default : return FALSE ;
}
* retnum = value ;
return TRUE ;
}
long doconstfloatmath ( )
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <E1ABA8> <20> <> ࠦ<EFBFBD> <E0A0A6> <EFBFBD> <EFBFBD>
{
float value ;
postnumflag = 0 ;
CheckMinusNum ( ) ;
if ( tok ! = tk_number ) {
numexpected ( ) ;
return ( 0 ) ;
}
if ( itok . rm = = tk_double ) * ( float * ) & itok . number = itok . dnumber ;
else if ( itok . rm ! = tk_float ) {
float temp = itok . number ;
* ( float * ) & itok . number = temp ;
}
value = itok . fnumber ;
// usedirectiv=TRUE;
calcnumber = TRUE ;
while ( itok2 . type = = tp_opperand ) { //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ࠭<EFBFBD>
nexttok ( ) ;
if ( tok2 ! = tk_number ) {
calcnumber = FALSE ;
return * ( long * ) & value ; //<2F> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ⢨<EFBFBD>
}
if ( itok2 . rm = = tk_double ) * ( float * ) & itok2 . number = itok2 . dnumber ;
else if ( itok2 . rm ! = tk_float ) * ( float * ) & itok2 . number = itok2 . number ;
itok2 . rm = tk_float ;
if ( calcfloatnumber ( & value , itok2 . fnumber , tok ) = = FALSE ) beep ( ) ;
nexttok ( ) ;
}
nexttok ( ) ;
calcnumber = FALSE ;
return * ( long * ) & value ;
}
int calcdoublenumber ( double * retnum , double number , int operand )
{
double value ;
value = * retnum ;
switch ( operand ) {
case tk_minus : value - = number ; break ;
case tk_plus : value + = number ; break ;
case tk_div : value / = number ; break ;
case tk_mult : value * = number ; break ;
case tk_divminus : value / = - number ; break ;
case tk_multminus : value * = - number ; break ;
default : return FALSE ;
}
* retnum = value ;
return TRUE ;
}
long long doconstdoublemath ( )
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <E1ABA8> <20> <> ࠦ<EFBFBD> <E0A0A6> <EFBFBD> <EFBFBD>
{
double value ;
postnumflag = 0 ;
CheckMinusNum ( ) ;
if ( tok ! = tk_number ) {
numexpected ( ) ;
return ( 0 ) ;
}
if ( itok . rm = = tk_float ) {
itok . dnumber = * ( float * ) & itok . number ;
itok . rm = tk_double ;
}
else if ( itok . rm ! = tk_double ) {
itok . dnumber = itok . lnumber ;
}
value = itok . dnumber ;
// usedirectiv=TRUE;
calcnumber = TRUE ;
while ( itok2 . type = = tp_opperand ) { //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ࠭<EFBFBD>
nexttok ( ) ;
if ( tok2 ! = tk_number ) {
calcnumber = FALSE ;
return * ( long long * ) & value ; //<2F> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ⢨<EFBFBD>
}
if ( itok2 . rm = = tk_float ) itok2 . dnumber = * ( float * ) & itok2 . number ;
else if ( itok2 . rm ! = tk_double ) itok2 . dnumber = itok2 . lnumber ; ;
itok2 . rm = tk_double ;
if ( calcdoublenumber ( & value , itok2 . dnumber , tok ) = = FALSE ) beep ( ) ;
nexttok ( ) ;
}
nexttok ( ) ;
calcnumber = FALSE ;
return * ( long long * ) & value ;
}
/* ================= simple syntax procedures start =================== */
void nextseminext ( )
{
nexttok ( ) ;
seminext ( ) ;
}
void seminext ( )
{
if ( tok ! = tk_semicolon ) expected ( ' ; ' ) ;
else nexttok ( ) ;
}
void beep ( ) /* beep for any internal errors */
{
printf ( " \a " ) ;
}
int expecting ( int want )
/* compares current token with want token. If different, issues error
message and returns 1 , else advances to next token and returns 0 */
{
if ( want ! = tok ) {
SwTok ( want ) ;
return ( 1 ) ;
}
nexttok ( ) ;
return ( 0 ) ;
}
void expectingoperand ( int want )
/* compares current token with want token. If different, issues error
message and returns 1 , else advances to next token and returns 0 */
{
if ( want ! = tok ) SwTok ( want ) ;
else getoperand ( ) ;
}
void SwTok ( int want )
{
switch ( want ) {
case tk_closebracket : expected ( ' ) ' ) ; break ;
case tk_openbracket : expected ( ' ( ' ) ; break ;
case tk_semicolon : expected ( ' ; ' ) ; break ;
case tk_colon : expected ( ' : ' ) ; break ;
case tk_openblock : expected ( ' [ ' ) ; break ;
case tk_closeblock : expected ( ' ] ' ) ; break ;
case tk_openbrace : expected ( ' { ' ) ; break ;
case tk_closebrace : expected ( ' } ' ) ; break ;
case tk_camma : expected ( ' , ' ) ; break ;
default : preerror ( " expecting a different token " ) ; break ;
}
}
/*-----------------03.07.99 22:48-------------------
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ७ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 楤 <EFBFBD> <EFBFBD> <EFBFBD>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
void outprocedure ( unsigned char * array , unsigned int length )
{
if ( ( outptr + length ) > = outptrsize ) CheckCodeSize ( ) ;
memcpy ( output + outptr , array , length ) ;
outptr + = length ;
if ( splitdata = = 0 ) outptrdata = outptr ;
}
# define MMBANER 11
unsigned char aabaner [ ] = {
0x53 , 0x50 , 0x48 , 0x49 , 0x4E , 0x58 , 0x43 , 0x2d , 0x2d , ver1 , ver2 } ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SPHINXC--ver
# define MMEXP 18
unsigned char aaEXP [ ] = {
0xD9 , 0xE8 , // fld1
0xD9 , 0xEA , //fldl2e
0xD8 , 0xCA , //fmul st, st(2)
0xDD , 0xD2 , //fst st(2)
0xD9 , 0xF8 , //fprem
0xD9 , 0xF0 , //f2xm1
0xDE , 0xC1 , //faddp st(1), st
0xD9 , 0xFD , //fscale
0xDD , 0xD9 } ; //fstp st(1)
void CallExitProcess ( )
//<2F> 맮<EFBFBD> <20> <> <EFBFBD> 楤<EFBFBD> <E6A5A4> <EFBFBD> ExitProcess
{
tok = tk_id ;
searchvar ( " ExitProcess " ) ;
if ( FastCallApi = = TRUE ) {
outword ( 0x15FF ) ;
AddApiToPost ( itok . number ) ;
}
else {
addacall ( ( unsigned int ) itok . number , ( unsigned char ) CALL_32 ) ;
callloc0 ( ) ; /* produce CALL [#] */
}
}
int includeit ( int type )
{
int i = 0 ;
itok . post = 1 ;
if ( strcmp ( " ABORT " , itok . name ) = = 0 ) {
RestoreStack ( ) ;
clearregstat ( ) ;
# ifdef OPTVARCONST
ClearLVIC ( ) ;
# endif
type = 0 ;
if ( type = = 1 & & dbg & 2 ) AddCodeNullLine ( " ABORT() " ) ;
if ( comfile = = file_w32 ) outword ( 0xC031 ) ; //xor eax,eax
if ( atex = = TRUE ) i = RetAtExit ( ) ;
if ( i = = 0 ) {
if ( comfile = = file_exe ) outdword ( 0x21CD4CB4 ) ;
else if ( comfile = = file_w32 ) {
if ( jumptomain ! = CALL_NONE ) jumploc ( startexit ) ;
else {
op ( 0x50 ) ;
CallExitProcess ( ) ;
}
}
else outword ( 0x20CD ) ;
}
retproc = TRUE ;
}
else if ( strcmp ( " ATEXIT " , itok . name ) = = 0 ) {
if ( type & & AlignProc ) AlignCD ( CS , alignproc ) ;
if ( atex = = FALSE ) preerror ( " ?atexit must be set for ATEXIT " ) ;
if ( type = = 1 & & dbg & 2 ) AddCodeNullLine ( " ATEXIT() " ) ;
searchvar ( " __atexitproc " ) ;
itok2 = itok ;
searchvar ( " __numatexit " ) ;
if ( am32 ) {
op ( 0x51 ) ; //push ecx
outword ( 0x0D8B ) ; //mov ecx,numatex
if ( itok . post ) setwordpost ( & itok ) ;
outdword ( itok . number ) ;
outdword ( 0x7310F983 ) ;
outdword ( 0x8D04890F ) ; //cmp ecx,10 jnb bp mov [numatexit+4+ECX*4]=EAX
if ( itok2 . post ) setwordpost ( & itok2 ) ;
outdword ( itok2 . number ) ;
outword ( 0x05FF ) ; //inc numatexit
if ( itok . post ) setwordpost ( & itok ) ;
outdword ( itok . number ) ;
outword ( 0xC031 ) ; //xor eax,eax
//bp:
op ( 0x59 ) ; //pop ECX
}
else {
outword ( 0x368B ) ;
if ( itok . post ) setwordpost ( & itok ) ;
outword ( itok . number ) ;
op ( 0x83 ) ;
outdword ( 0x0C7310FE ) ; //cmp si,10 jnb
outdword ( 0x8489F601 ) ; //si+=si
if ( itok2 . post ) setwordpost ( & itok2 ) ;
outword ( itok2 . number ) ;
outword ( 0x06FF ) ;
if ( itok . post ) setwordpost ( & itok ) ;
outword ( itok . number ) ;
outword ( 0xC031 ) ;
}
}
else if ( strcmp ( " EXIT " , itok . name ) = = 0 ) {
RestoreStack ( ) ;
clearregstat ( ) ;
# ifdef OPTVARCONST
ClearLVIC ( ) ;
# endif
type = 0 ;
if ( dbg & 2 ) AddCodeNullLine ( " EXIT() " ) ;
if ( atex = = TRUE ) i = RetAtExit ( ) ;
if ( i = = 0 ) {
if ( comfile = = file_w32 ) {
if ( jumptomain ! = CALL_NONE ) jumploc ( startexit ) ;
else {
op ( 0x50 ) ;
CallExitProcess ( ) ;
}
}
else if ( comfile = = file_meos ) {
outdword ( 0xCDFFC883 ) ;
op ( 0x40 ) ;
}
else outdword ( 0x21CD4CB4 ) ;
}
retproc = TRUE ;
}
else return ConvRetCode ( FindProcLib ( type ) ) ;
if ( type = = 1 ) ret ( ) ; /* if it is a REG Proc not a MACRO */
return ( am32 = = FALSE ? tk_word : tk_dword ) ;
}
int ConvRetCode ( int i )
{
switch ( i ) {
case 0 : return tk_void ;
case 1 : return tk_char ;
case 2 : return tk_byte ;
case 3 : return tk_int ;
case 4 : return tk_word ;
case 5 : return tk_long ;
case 6 : return tk_dword ;
case 7 : return tk_float ;
default : return - 1 ;
}
}
int RetAtExit ( )
{
if ( comfile = = file_exe | | fobj ! = FALSE | | comfile = = file_w32 | | comfile = = file_meos ) {
jumploc ( startexit ) ;
return 1 ;
}
else callloc ( startexit ) ;
return 0 ;
}
int includeproc ( )
{
return ConvRetCode ( FindProcLib ( 1 ) ) ;
}
/*-----------------18.01.99 22:42-------------------
<EFBFBD> <EFBFBD> <EFBFBD> ய <EFBFBD> <EFBFBD> 楤 <EFBFBD> <EFBFBD> <EFBFBD>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int CheckMacros ( )
{
int m , app = 0 , s32 = 0 ;
unsigned int num ;
char * ofsstr = NULL ;
int razr ;
for ( m = 0 ; m < m_end ; m + + ) if ( strcmp ( macroname [ m ] , ( char * ) string ) = = 0 ) break ;
if ( m = = m_end ) return tokens ;
nexttok ( ) ;
ofsstr = GetLecsem ( tk_closebracket , tk_camma ) ;
nexttok ( ) ;
if ( m < m_sqrt ) {
switch ( m ) {
case m_id :
s32 + + ;
case m_iw :
app + + ;
case m_ib :
case m_ibt :
if ( tok ! = tk_closebracket ) {
if ( tok = = tk_number ) {
num = doconstlongmath ( ) ;
if ( num < 256 ) {
if ( s32 ! = 0 ) op66 ( r32 ) ;
else if ( app = = 1 ) op66 ( r16 ) ;
op ( 0xe4 + app ) ;
op ( num ) ;
break ;
}
if ( optimizespeed ) {
op ( 0xB8 + DX ) ; // MOV reg,#
if ( am32 ) outdword ( num ) ;
else outword ( num ) ;
}
else {
op66 ( r16 ) ;
op ( 0xB8 + DX ) ; // MOV reg,#
outword ( num ) ;
}
}
else getintoreg ( EDX , r16 , 0 , & ofsstr ) ;
if ( ofsstr ) {
IDZToReg ( ofsstr , DX , r16 ) ;
free ( ofsstr ) ;
ofsstr = NULL ;
}
}
if ( s32 ! = 0 ) op66 ( r32 ) ;
else if ( app = = 1 ) op66 ( r16 ) ;
op ( 0xEC + app ) ;
ClearReg ( AL ) ;
break ;
case m_od :
s32 + + ;
case m_ow :
app + + ;
case m_ob :
case m_obt :
if ( tok ! = tk_closebracket ) {
if ( s32 ! = 0 ) {
do_e_axmath ( 0 , r32 , & ofsstr ) ;
razr = r32 ;
}
else if ( app ! = 0 ) {
do_e_axmath ( 0 , r16 , & ofsstr ) ;
razr = r16 ;
}
else {
doalmath ( 0 , & ofsstr ) ;
razr = r8 ;
}
if ( ofsstr ) {
IDZToReg ( ofsstr , AX , razr ) ;
free ( ofsstr ) ;
ofsstr = NULL ;
}
if ( tok = = tk_camma ) {
ofsstr = GetLecsem ( tk_camma , tk_closebracket ) ;
nexttok ( ) ;
if ( tok = = tk_number ) {
num = doconstlongmath ( ) ;
if ( num < 256 ) {
if ( s32 ! = 0 ) op66 ( r32 ) ;
else if ( app = = 1 ) op66 ( r16 ) ;
op ( 0xe6 + app ) ;
op ( num ) ;
goto enout ;
}
if ( optimizespeed ) {
op ( 0xB8 + DX ) ; // MOV reg,#
if ( am32 ) outdword ( num ) ;
else outword ( num ) ;
}
else {
op66 ( r16 ) ;
op ( 0xB8 + DX ) ; // MOV reg,#
outword ( num ) ;
}
}
else getintoreg ( EDX , r16 , 0 , & ofsstr ) ;
if ( ofsstr ) {
IDZToReg ( ofsstr , DX , r16 ) ;
free ( ofsstr ) ;
ofsstr = NULL ;
}
}
}
if ( s32 ! = 0 ) op66 ( r32 ) ;
else if ( app = = 1 ) op66 ( r16 ) ;
op ( 0xEE + app ) ;
enout :
if ( ofsstr ) free ( ofsstr ) ;
return tk_void ;
}
if ( ofsstr ) free ( ofsstr ) ;
}
else {
if ( ofsstr ) free ( ofsstr ) ;
if ( tok = = tk_closebracket ) {
missingpar ( macroname [ m ] ) ;
return ( tokens ) ;
}
doeaxfloatmath ( tk_fpust ) ;
switch ( m ) {
case m_sqrt :
outword ( 0xFAD9 ) ; //FSQRT
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_cos :
outword ( 0xFFD9 ) ;
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_sin :
outword ( 0xFED9 ) ;
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_atan2 :
if ( expecting ( tk_camma ) ) {
missingpar ( macroname [ m ] ) ;
return tokens ;
}
doeaxfloatmath ( tk_fpust ) ;
outword ( 0xF3D9 ) ; //FPATAN
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_tan :
outdword ( 0xD8DDF2D9 ) ; //FPTAN fstp st
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_log :
outword ( 0xEDD9 ) ; //fldln2
outdword ( 0xF1D9C9D9 ) ; //fxch st1 fyl2x
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_log10 :
outword ( 0xECD9 ) ; //fldlg2
outdword ( 0xF1D9C9D9 ) ; //fxch st1 fyl2x
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_exp :
outprocedure ( aaEXP , MMEXP ) ;
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_atan :
outdword ( 0xF3D9E8D9 ) ; //FLD1 FPATAN
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
case m_fabs :
outword ( 0xE1D9 ) ; //FABS
return tk_fpust ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> ⥪<EFBFBD> fpu
}
}
if ( s32 ! = 0 ) return tk_dword ;
if ( app ! = 0 ) return tk_word ;
return tk_byte ;
}
/*-----------------06.02.99 16:09-------------------
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 譥 <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ⥪ <EFBFBD> <EFBFBD>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
typedef struct _IPROC_
{
unsigned short size ;
unsigned short ofs ;
unsigned char cpu ;
} IPROC ;
struct _HLIB_
{
char name [ 33 ] ;
unsigned char rettype ;
unsigned short size ;
unsigned char dosr [ 2 ] ;
IPROC info [ 4 ] ;
} hlib ;
int FindProcLib ( int type )
{
static int lhandl = - 1 ;
long ofs = 0 ;
char m1 [ 80 ] ;
int index ;
if ( am32 ) return - 1 ;
if ( lhandl = = - 1 ) {
sprintf ( m1 , " %s%s " , findpath [ 0 ] , " mainlib.ldp " ) ;
if ( ( lhandl = open ( m1 , O_RDONLY | O_BINARY ) ) = = - 1 ) return - 1 ;
}
lseek ( lhandl , 0 , SEEK_SET ) ;
if ( chip < 3 ) {
if ( optimizespeed = = 0 ) index = 0 ;
else index = 1 ;
}
else {
if ( optimizespeed = = 0 ) index = 2 ;
else index = 3 ;
}
for ( ; ; ) {
if ( read ( lhandl , & hlib , sizeof ( _HLIB_ ) ) ! = sizeof ( _HLIB_ ) ) break ;
if ( strcmp ( ( char * ) itok . name , hlib . name ) = = 0 ) {
int size ;
if ( ( outptr + hlib . size ) > = outptrsize ) CheckCodeSize ( ) ;
lseek ( lhandl , ofs + sizeof ( _HLIB_ ) + hlib . info [ index ] . ofs , SEEK_SET ) ;
size = hlib . info [ index ] . size ;
if ( type ! = 1 ) size - - ;
else if ( dbg & 2 ) {
sprintf ( m1 , " %s() " , itok . name ) ;
AddCodeNullLine ( m1 ) ;
}
if ( read ( lhandl , output + outptr , size ) ! = size ) break ;
outptr + = size ;
if ( splitdata = = 0 ) outptrdata = outptr ;
if ( cpu < hlib . info [ index ] . cpu ) cpu = hlib . info [ index ] . cpu ;
if ( hlib . dosr [ 1 ] ! = 0 ) {
if ( hlib . dosr [ 1 ] > dos1 ) {
dos1 = hlib . dosr [ 1 ] ;
dos2 = hlib . dosr [ 0 ] ;
}
else if ( hlib . dosr [ 1 ] = = dos1 & & hlib . dosr [ 0 ] > dos2 ) dos2 = hlib . dosr [ 0 ] ;
}
clearregstat ( ) ;
# ifdef OPTVARCONST
ClearLVIC ( ) ;
# endif
return hlib . rettype ;
}
ofs + = sizeof ( _HLIB_ ) + hlib . size ;
lseek ( lhandl , ofs , SEEK_SET ) ;
}
return - 1 ;
}
void addconsttotree ( char * keystring , long long constvalue , int type )
//<2F> <> ⠢<EFBFBD> <E2A0A2> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ⠭<EFBFBD> <E2A0AD> <20> <20> <> ॢ<EFBFBD>
{
struct idrec * ptr , * newptr ;
int cmpresult ;
newptr = ( struct idrec * ) MALLOC ( sizeof ( struct idrec ) ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ⠭<EFBFBD> <E2A0AD>
ptr = definestart ;
if ( ptr = = NULL ) definestart = newptr ;
else {
while ( ( ( cmpresult = strcmp ( ptr - > recid , keystring ) ) < 0 & & ptr - > left ! = NULL ) | | ( cmpresult > 0 & & ptr - > right ! = NULL ) ) {
if ( cmpresult < 0 ) ptr = ptr - > left ;
else if ( cmpresult > 0 ) ptr = ptr - > right ;
}
if ( cmpresult < 0 ) ptr - > left = newptr ;
else if ( cmpresult > 0 ) ptr - > right = newptr ;
else {
free ( newptr ) ;
if ( ptr - > newid ) {
free ( ptr - > newid ) ;
ptr - > newid = NULL ;
}
if ( ptr - > sbuf ) {
free ( ptr - > sbuf ) ;
ptr - > sbuf = NULL ;
}
ptr - > recnumber = constvalue ;
ptr - > recrm = type ;
ptr - > rectok = tk_number ;
ptr - > recsegm = DS ;
ptr - > recpost = 0 ;
ptr - > flag = 0 ;
ptr - > recsize = 0 ;
return ;
}
}
strcpy ( newptr - > recid , keystring ) ;
newptr - > newid = NULL ;
newptr - > rectok = tk_number ;
newptr - > reclnumber = constvalue ;
newptr - > recsegm = DS ;
newptr - > recrm = type ;
newptr - > recpost = 0 ;
newptr - > flag = 0 ;
newptr - > recsize = 0 ;
newptr - > left = NULL ;
newptr - > right = NULL ;
// newptr->count=1;
}
void addtodefine ( char * keystring ) //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ப<EFBFBD> <20> <20> <> ॢ<EFBFBD> define
{
struct idrec * ptr , * newptr , * left = NULL , * right = NULL ;
int cmpresult ;
//<2F> 뤥<EFBFBD> <EBA4A5> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD>
newptr = ( struct idrec * ) MALLOC ( sizeof ( struct idrec ) ) ;
ptr = definestart ; //<2F> <> 砫<EFBFBD> <20> <> ॢ<EFBFBD>
if ( ptr = = NULL ) definestart = newptr ;
else { //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ப<EFBFBD> <20> <20> <> ॢ<EFBFBD>
while ( ( ( cmpresult = strcmp ( ptr - > recid , keystring ) ) < 0 & & ptr - > left ! = NULL ) | |
( cmpresult > 0 & & ptr - > right ! = NULL ) ) {
if ( cmpresult < 0 ) ptr = ptr - > left ;
else if ( cmpresult > 0 ) ptr = ptr - > right ;
}
if ( cmpresult < 0 ) ptr - > left = newptr ; //<2F> <> ப<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else if ( cmpresult > 0 ) ptr - > right = newptr ;
else {
free ( newptr ) ;
newptr = ptr ;
left = ptr - > left ;
right = ptr - > right ;
if ( newptr - > newid ) free ( newptr - > newid ) ;
if ( newptr - > sbuf ) free ( newptr - > sbuf ) ;
}
}
strcpy ( newptr - > recid , keystring ) ; //<> <E1AAAE> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
newptr - > newid = NULL ;
if ( tok = = tk_string ) {
newptr - > newid = ( char * ) MALLOC ( itok . number ) ;
memcpy ( newptr - > newid , string , itok . number ) ;
if ( itok . rm = = 1 ) newptr - > sbuf = BackString ( ( char * ) string3 ) ;
}
else {
if ( string [ 0 ] ! = 0 ) newptr - > newid = BackString ( ( char * ) string ) ;
newptr - > sbuf = NULL ;
}
newptr - > rectok = tok ;
newptr - > recnumber = itok . number ;
newptr - > recsegm = itok . segm ;
newptr - > recrm = itok . rm ;
newptr - > recpost = itok . post ;
newptr - > flag = itok . flag ;
newptr - > recsize = itok . size ;
newptr - > left = left ;
newptr - > right = right ;
newptr - > recsib = itok . sib ;
newptr - > line = linenumber ;
newptr - > file = currentfileinfo ;
newptr - > count = 0 ;
newptr - > type = itok . type ;
newptr - > npointr = itok . npointr ;
itok . rec = newptr ;
}
unsigned char get_directive_value ( ) //return the 0 or 1 value for directive
{
nexttok ( ) ;
if ( tok = = tk_number ) {
if ( doconstlongmath ( ) ) return ( 1 ) ; //<2F> <20> <> <EFBFBD> 祭<EFBFBD> <E7A5AD> <20> <> <20> 㫥<EFBFBD> <E3ABA5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 1
return ( 0 ) ;
}
numexpected ( ) ;
nexttok ( ) ;
return ( 0 ) ;
}
int GetStringAsIt ( )
{
int tstr ;
if ( tok2 = = tk_string ) {
nexttok ( ) ;
tstr = 1 ;
}
else {
inptr = inptr2 ;
cha = cha2 ;
whitespace ( ) ;
if ( cha = = ' < ' ) {
tstr = 0 ;
for ( int i = 0 ; i < STRLEN ; i + + ) {
nextchar ( ) ;
if ( cha = = ' > ' ) {
string3 [ i ] = 0 ;
break ;
}
if ( cha = = 13 | | cha = = 26 ) goto errstr ;
string3 [ i ] = cha ;
}
nextchar ( ) ;
}
else {
errstr :
stringexpected ( ) ;
tstr = - 1 ;
}
inptr2 = inptr ;
linenum2 = linenumber ;
cha2 = cha ;
}
return tstr ;
}
void InitDefineConst ( )
{
addconsttotree ( " TRUE " , TRUE ) ;
addconsttotree ( " FALSE " , FALSE ) ;
addconsttotree ( " __SECOND__ " , timeptr . tm_sec ) ;
addconsttotree ( " __MINUTE__ " , timeptr . tm_min ) ;
addconsttotree ( " __HOUR__ " , timeptr . tm_hour ) ;
addconsttotree ( " __DAY__ " , timeptr . tm_mday ) ;
addconsttotree ( " __MONTH__ " , timeptr . tm_mon ) ;
addconsttotree ( " __YEAR__ " , timeptr . tm_year + 1900 ) ;
addconsttotree ( " __WEEKDAY__ " , timeptr . tm_wday ) ;
addconsttotree ( " __VER1__ " , ver1 ) ;
addconsttotree ( " __VER2__ " , ver2 ) ;
tok = tk_string ;
itok . flag = zero_term ;
itok . rm = 0 ;
strcpy ( ( char * ) string , ( char * ) compilerstr ) ;
itok . number = strlen ( ( char * ) string ) ;
addtodefine ( " __COMPILER__ " ) ;
strcpy ( ( char * ) string , asctime ( & timeptr ) ) ;
itok . number = strlen ( ( char * ) string ) - 1 ;
string [ itok . number ] = 0 ;
addtodefine ( " __DATESTR__ " ) ;
DateToStr ( ( char * ) string ) ;
itok . number = 11 ;
addtodefine ( " __DATE__ " ) ;
sprintf ( ( char * ) string , " %02d:%02d:%02d " , timeptr . tm_hour , timeptr . tm_min , timeptr . tm_sec ) ;
itok . number = 8 ;
addtodefine ( " __TIME__ " ) ;
strcpy ( ( char * ) string , " struct " ) ;
tok = tk_struct ;
itok . number = 6 ;
addtodefine ( " class " ) ;
}
char * AddTextToBuf ( char * buf , int * size , int start , int add )
{
int addsize ;
addsize = ( add = = 0 ? itok . number - 1 : inptr ) - start ;
* size + = addsize ;
if ( ! buf ) {
buf = ( char * ) MALLOC ( * size + 1 + add ) ;
buf [ 0 ] = 0 ;
}
else buf = ( char * ) REALLOC ( buf , * size + 1 + add ) ;
// printf("size=%d %s\n",*size+1+add,(char *)(input+start));
strncat ( buf , ( char * ) ( input + start ) , addsize ) ;
buf [ * size ] = 0 ;
return buf ;
}
void AddMacro ( char * name , int numpar , char * paramstr )
{
int start , size ;
char * bstring = NULL ;
idrec * ptr ;
start = inptr - 1 ;
size = 0 ;
do {
FastTok ( 2 ) ;
if ( tok = = tk_comment1 ) {
inptr = itok . number ;
cha = input [ itok . number - 1 ] ;
break ;
}
if ( tok = = tk_comment2 ) {
bstring = AddTextToBuf ( bstring , & size , start , 0 ) ;
start = inptr - 1 ;
}
} while ( tok ! = tk_endline & & tok ! = tk_eof ) ;
bstring = AddTextToBuf ( bstring , & size , start , 1 ) ;
strbtrim ( bstring ) ;
size = strlen ( bstring ) ;
bstring [ size ] = 0x20 ;
bstring [ size + 1 ] = 0 ;
inptr2 = inptr ;
cha2 = cha ;
linenum2 = linenumber ;
tok = tk_macro ;
itok . size = numpar ;
string [ 0 ] = 0 ;
/* int i;
for ( i = 0 , size = 0 ; i < numpar ; i + + ) {
puts ( paramstr + size ) ;
size + = strlen ( paramstr + size ) + 1 ;
} */
// printf("tok=%d %s %s\n",tok,name,bstring);
addtodefine ( name ) ;
ptr = itok . rec ;
ptr - > newid = paramstr ;
ptr - > sbuf = bstring ;
ptr - > line = linenumber - 1 ;
}
void GetMacro ( char * name )
{
int size , nsize , numpar = 0 ;
char * paramstr ;
inptr = inptr2 ;
cha = cha2 ;
FastTok ( 0 ) ;
FastTok ( 1 ) ;
size = 0 ;
while ( tok ! = tk_closebracket & & tok ! = tk_eof ) {
if ( tok ! = tk_id ) varexpected ( numpar + 1 ) ;
nsize = strlen ( itok . name ) + 1 ;
if ( size = = 0 ) paramstr = ( char * ) MALLOC ( nsize ) ;
else paramstr = ( char * ) REALLOC ( paramstr , size + nsize ) ;
strcpy ( paramstr + size , itok . name ) ;
size + = nsize ;
numpar + + ;
FastTok ( 0 ) ;
if ( tok ! = tk_closebracket ) {
if ( tok ! = tk_camma ) expected ( ' , ' ) ;
FastTok ( 1 ) ;
}
}
if ( tok = = tk_eof ) unexpectedeof ( ) ;
AddMacro ( name , numpar , paramstr ) ;
}
int pushpop ( int i )
{
STACKALIGN * newpar ;
switch ( i ) {
case 1 :
newpar = ( STACKALIGN * ) MALLOC ( sizeof ( STACKALIGN ) ) ;
newpar - > prev = stackalign ;
newpar - > size = strpackcur ;
newpar - > id [ 0 ] = 0 ;
stackalign = newpar ;
return TRUE ;
case 2 :
newpar = stackalign - > prev ;
free ( stackalign ) ;
stackalign = newpar ;
strpackcur = ( stackalign ! = NULL ? stackalign - > size : strpackdef ) ;
return TRUE ;
}
return FALSE ;
}
void doifdef ( int intok )
{
int defcond ;
int curcond ;
int bracket ;
int notflag ;
int next ;
int locrez , endrez , lastoper ;
int stopscan ;
unsigned int i ;
int oscanlexmode ;
dirmode = dm_if ;
/* string3[0]=cha2;
int j = 1 ;
for ( i = inptr2 ; input [ i ] > 13 ; i + + , j + + ) string3 [ j ] = input [ i ] ;
string3 [ j ] = 0 ;
printf ( " %s (%u) %s %s " , ( startfileinfo + currentfileinfo ) - > filename , linenumber , itok . name , string3 ) ;
*/
defcond = intok ;
if ( intok = = d_if | | intok = = d_elif ) defcond = d_ifdef ;
curcond = defcond ;
oscanlexmode = scanlexmode ;
bracket = 0 ;
lastoper = tk_oror ;
endrez = 0 ;
stopscan = FALSE ;
do {
scanlexmode = DEFLEX ;
nexttok ( ) ;
notflag = FALSE ;
next = TRUE ;
while ( tok = = tk_openbracket ) {
nexttok ( ) ;
bracket + + ;
}
if ( tok = = tk_not ) {
notflag = TRUE ;
nexttok ( ) ;
}
if ( tok = = tk_id & & strcmp ( " defined " , itok . name ) = = 0 ) {
nexttok ( ) ;
curcond = ( notflag = = FALSE ? d_ifdef : d_ifndef ) ;
}
while ( tok = = tk_openbracket ) {
nexttok ( ) ;
bracket + + ;
}
// printf("tok=%d type2=%d\n",tok,itok2.type);
if ( tok = = tk_number ) {
locrez = 1 ;
if ( itok2 . type = = tp_opperand ) {
i = doconstdwordmath ( ) ;
next = 0 ;
if ( itok . type = = tp_compare ) locrez = CompConst ( i ) ;
}
else if ( itok2 . type = = tp_compare ) {
i = itok . number ;
nexttok ( ) ;
locrez = CompConst ( i ) ;
}
}
else if ( ( locrez = ifdefconst ( ) ) = = 2 ) {
if ( tok = = tk_id | | tok = = tk_ID ) {
if ( FindTeg ( TRUE ) ) locrez = 1 ;
else locrez = 0 ;
}
else locrez = 1 ;
}
if ( curcond = = d_ifndef ) locrez ^ = 1 ;
if ( stopscan = = FALSE ) {
if ( lastoper = = tk_oror ) endrez | = locrez ;
else {
endrez & = locrez ;
if ( endrez = = FALSE ) stopscan = TRUE ;
}
}
// printf("lastoper=%d endrez=%d locrez=%d\n",lastoper,endrez,locrez);
if ( next ) nexttok ( ) ;
while ( tok = = tk_closebracket ) {
nexttok ( ) ;
bracket - - ;
}
if ( tok = = tk_endline | | tok2 = = tk_endline ) {
scanlexmode = oscanlexmode ;
// retoldscanmode(oscanlexmode);
dirmode = dm_other ;
nexttok ( ) ;
break ;
}
if ( tok = = tk_oror | | tok = = tk_andand ) lastoper = tok ;
else {
preerror ( " bad token in 'ifdef/ifndef/if' " ) ;
// printf("tok=%d\n",tok);
}
} while ( tok ! = tk_eof & & tok ! = tk_endline ) ;
dirmode = dm_other ;
scanlexmode = oscanlexmode ;
// retoldscanmode(oscanlexmode);
if ( bracket > 0 ) preerror ( " missing ')' " ) ;
else if ( bracket < 0 ) preerror ( " extra ')' " ) ;
gotoendif = 1 ^ endrez ;
if ( intok ! = d_elif ) {
endifcount + + ;
CheckNumIF ( ) ;
useelse [ endifcount ] = 1 ;
}
// printf(" %s endifcount=%d\n",endrez==0?"FALSE":"TRUE",endifcount);
}
void InitIdxRegs ( )
{
unsigned char lreg [ 8 ] ;
int i , j ;
for ( i = 0 ; i < 8 ; i + + ) lreg [ i ] = 0 ;
nexttok ( ) ;
// printf("tok=%d %s\n",tok,itok.name);
for ( i = 0 ; tok = = tk_reg32 | | tok = = tk_reg | | tok = = tk_beg ; i + + ) {
if ( i < 4 ) {
if ( tok = = tk_beg & & itok . number > 3 ) itok . number - = 4 ;
idxregs [ i ] = itok . number ;
if ( lreg [ itok . number ] ) preerror ( " expected unique register for \" pragma indexregs \" " ) ;
lreg [ itok . number ] = 1 ;
}
nexttok ( ) ;
if ( tok = = tk_camma ) nexttok ( ) ;
}
lreg [ ESP ] = lreg [ EBP ] = 1 ;
for ( ; i < 4 ; i + + ) {
if ( lreg [ idxregs [ i ] ] = = 0 ) lreg [ idxregs [ i ] ] = 1 ;
else {
for ( j = 7 ; j > = 0 ; j - - ) {
if ( lreg [ j ] = = 0 ) {
lreg [ j ] = 1 ;
idxregs [ i ] = j ;
break ;
}
}
}
}
}
void directive ( )
{
unsigned char next = 1 ;
char holdid [ IDLENGTH ] ;
long longhold , longhold2 ;
long long llhold ;
unsigned int i ;
int oscanlexmode ;
holdid [ 0 ] = DS ;
usedirectiv = TRUE ;
dirmode = dm_other ;
switch ( itok . number ) {
case d_alignc :
holdid [ 0 ] = CS ;
case d_align : //<2F> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> ⠢<EFBFBD> <E2A0A2> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
if ( notdoneprestuff = = TRUE ) doprestuff ( ) ; //<2F> <> 砫<EFBFBD> <E7A0AB> <EFBFBD> <EFBFBD> <20> <> <EFBFBD>
i = 2 ;
nexttok ( ) ;
next = 0 ;
if ( tok = = tk_number ) {
i = doconstlongmath ( ) ;
if ( i < 2 ) i = 2 ;
}
i = AlignCD ( holdid [ 0 ] , i ) ;
if ( holdid [ 0 ] = = DS ) alignersize + = i ;
break ;
case d_aligner : //<2F> <> <EFBFBD> 祭<EFBFBD> <E7A5AD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ⠢<EFBFBD> <E2A0A2>
nexttok ( ) ;
if ( tok = = tk_number ) {
aligner = ( unsigned char ) doconstlongmath ( ) ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <E1ABA8> <20> <> <EFBFBD> 祭<EFBFBD> <E7A5AD>
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_alignw : //<2F> <> ࠢ<EFBFBD> <E0A0A2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ᮢ
alignword = get_directive_value ( ) ;
next = 0 ;
break ;
// case d_beep: beep(); break;
case d_code : optimizespeed = 0 ; break ;
case d_ctrl :
killctrlc = get_directive_value ( ) ;
next = 0 ;
break ;
case d_define :
dirmode = dm_def0 ;
oscanlexmode = scanlexmode ;
scanlexmode = DEFLEX2 ;
nexttok ( ) ;
scanlexmode = DEFLEX ;
dirmode = dm_def ;
strcpy ( holdid , itok . name ) ;
// printf("1 line=%d\n",linenumber);
// printf("tok=%d %s\n",tok,itok.name);
if ( tok = = tk_id | | tok = = tk_ID ) {
if ( cha2 = = ' ( ' ) {
GetMacro ( holdid ) ;
}
else {
longhold = inptr2 ;
longhold2 = cha2 ;
nexttok ( ) ;
// printf("2 line=%d\n",linenumber);
i = tk_dword ;
if ( ( tok = = tk_float | | tok = = tk_double | | tok = = tk_qword ) & & ( tok2 = = tk_minus | | tok2 = = tk_number ) ) {
i = tok ;
nexttok ( ) ;
}
// printf("tok=%d tok2=%d %s %s\n",tok,tok2,itok.name,string);
if ( tok ! = tk_endline & & tok ! = tk_minus & & tok ! = tk_number & & tok2 ! = tk_endline & & tok2 ! = tk_semicolon ) {
inptr = longhold ;
cha = longhold2 ;
AddMacro ( holdid , 0 , NULL ) ;
}
else {
switch ( tok ) {
case tk_structvar :
struct idrec * ptrs , * ptrsnew ;
ptrs = itok . rec ;
addtodefine ( holdid ) ;
ptrsnew = itok . rec ;
if ( ptrsnew - > newid ) free ( ptrsnew - > newid ) ;
ptrsnew - > newid = ptrs - > newid ;
break ;
case tk_eof : unexpectedeof ( ) ; break ;
case tk_string :
// printf("tok=%d tok2=%d %s %s\n",tok,tok2,itok.name,string);
if ( cha2 = = 13 & & itok . name [ 0 ] = = 0 ) {
cha2 = input [ inptr2 ] ;
inptr2 + + ;
}
goto endef ;
case tk_minus :
if ( tok2 = = tk_number ) {
if ( i = = tk_dword & & ( itok2 . rm = = tk_float | | itok2 . rm = = tk_double | |
itok2 . rm = = tk_qword ) ) i = itok2 . rm ;
case tk_number :
if ( i = = tk_dword & & ( itok . rm = = tk_float | | itok . rm = = tk_double | | itok . rm = = tk_qword ) ) i = itok . rm ;
switch ( i ) {
case tk_float :
llhold = doconstfloatmath ( ) ;
break ;
case tk_double :
llhold = doconstdoublemath ( ) ;
break ;
case tk_qword :
llhold = doconstqwordmath ( ) ;
break ;
default :
llhold = doconstdwordmath ( ) ;
break ;
}
itok . flag = ( unsigned char ) postnumflag ;
addconsttotree ( holdid , llhold , i ) ;
next = 0 ;
break ;
}
case tk_proc :
case tk_apiproc :
case tk_declare :
case tk_undefproc :
tok = tk_id ;
strcpy ( ( char * ) string , itok . name ) ;
default :
endef :
if ( itok . type ! = tp_modif ) itok . type = tp_ucnovn ;
addtodefine ( holdid ) ; break ;
}
}
}
}
else idalreadydefined ( ) ;
// retoldscanmode(oscanlexmode);
scanlexmode = oscanlexmode ;
if ( tok = = tk_endline ) {
// nextchar();
nexttok ( ) ;
next = 0 ;
}
// printf("3 line=%d cha=%02X\n",linenumber,cha2);
break ;
case d_DOS :
nexttok ( ) ;
if ( tok = = tk_number ) {
longhold = doconstlongmath ( ) ;
longhold2 = dos1 * 256 + dos2 ;
if ( longhold > longhold2 ) {
dos1 = ( unsigned char ) ( longhold / 256 ) ;
dos2 = ( unsigned char ) ( longhold % 256 ) ;
}
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_endif :
if ( endifcount = = - 1 ) preerror ( " ?endif without preceeding ?if " ) ;
else endifcount - - ;
// printf("%s (%u) endif: endifcount=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,endifcount);
break ;
case d_ifdef :
case d_if :
case d_ifndef :
doifdef ( itok . number ) ;
if ( gotoendif = = 0 ) useelse [ endifcount ] | = 2 ;
next = 0 ;
break ;
case d_incl :
i = GetStringAsIt ( ) ;
usedirectiv = FALSE ;
if ( ( int ) i ! = - 1 ) {
char * a ;
if ( ( a = strrchr ( ( char * ) string3 , ' . ' ) ) ! = NULL ) {
if ( stricmp ( a , " .obj " ) = = 0 ) {
AddNameObj ( ( char * ) string3 , i , 0 ) ;
break ;
}
if ( stricmp ( a , " .lib " ) = = 0 ) {
AddNameObj ( ( char * ) string3 , i , 1 ) ;
break ;
}
}
// puts((char *)string3);
IncludeFile ( ( char * ) string3 , i ) ;
}
break ;
case d_jump :
nexttok ( ) ;
if ( tok = = tk_number ) {
jumptomain = CALL_NEAR ;
if ( ( unsigned int ) itok . number = = 0 ) {
jumptomain = CALL_NONE ;
header = 0 ;
}
}
else if ( stricmp ( itok . name , " NONE " ) = = 0 ) {
jumptomain = CALL_NONE ;
header = 0 ;
}
else if ( stricmp ( itok . name , " SHORT " ) = = 0 ) jumptomain = CALL_SHORT ;
else if ( stricmp ( itok . name , " NEAR " ) = = 0 ) jumptomain = CALL_NEAR ;
else preerror ( ujo ) ;
break ;
case d_error :
nexttok ( ) ;
if ( tok = = tk_number ) {
maxerrors = doconstlongmath ( ) ;
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_command :
parsecommandline = get_directive_value ( ) ;
next = 0 ;
break ;
case d_argc :
parsecommandline = fargc = get_directive_value ( ) ;
next = 0 ;
break ;
case d_print :
nexttok ( ) ;
i = 0 ;
if ( strcmp ( itok . name , " error " ) = = 0 ) {
i = 1 ;
nexttok ( ) ;
}
switch ( tok ) {
case tk_string :
printf ( " %s " , string ) ;
break ;
case tk_number :
printf ( " \n %u " , itok . number ) ;
break ;
default : preerror ( " unsupported token for #print " ) ; break ;
}
if ( i ) exit ( e_preprocess ) ;
break ;
case d_prnex :
nexttok ( ) ;
if ( tok = = tk_number ) printf ( " %X " , itok . number ) ;
else numexpected ( ) ;
break ;
case d_random :
if ( notdoneprestuff = = TRUE ) doprestuff ( ) ;
op ( rand ( ) ) ;
break ;
case d_resize :
resizemem = get_directive_value ( ) ;
next = 0 ;
break ;
case d_resmes :
nexttok ( ) ;
if ( tok = = tk_string ) {
itok . flag = dos_term ;
addtotree ( " __RESIZEMESSAGE " ) ;
addconsttotree ( " __resizemessage " , TRUE ) ;
}
else stringexpected ( ) ;
break ;
case d_speed : optimizespeed = 1 ; break ;
case d_stack :
nexttok ( ) ;
if ( tok = = tk_number ) {
longhold = doconstlongmath ( ) ;
if ( am32 = = FALSE & & ( longhold > 0xFEFF | | longhold < 0 ) ) preerror ( " invalid size for stack " ) ;
else {
if ( comfile ! = file_sys ) stacksize = longhold ;
else sysstack = longhold ;
}
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_start :
nexttok ( ) ;
if ( comfile = = file_com ) {
if ( tok = = tk_number ) {
startptrdata = startptr = doconstlongmath ( ) ;
if ( startStartup ! = 0x100 ) startStartup = startptr ;
}
else {
numexpected ( ) ;
nexttok ( ) ;
}
next = 0 ;
}
else OnlyComFile ( ) ;
break ;
case d_8086 : case d_8088 : chip = 0 ; break ;
case d_80186 : chip = 1 ; break ;
case d_80286 : chip = 2 ; break ;
case d_80386 : chip = 3 ; break ;
case d_80486 : chip = 4 ; break ;
case d_80586 : chip = 5 ; break ;
case d_80686 : chip = 6 ; break ;
case d_80786 : chip = 7 ; break ;
case d_atr :
nexttok ( ) ;
if ( tok = = tk_number ) {
sysatr = doconstlongmath ( ) ;
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_name :
nexttok ( ) ;
if ( tok = = tk_string ) {
int i ;
for ( i = 0 ; i < 8 & & string [ i ] ! = 0 ; i + + ) sysname [ i ] = string [ i ] ;
for ( ; i < 8 ; i + + ) sysname [ i ] = ' ' ;
}
else stringexpected ( ) ;
break ;
case d_com : //ᯨ᮪ <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> SYS
listcom = ( LISTCOM * ) MALLOC ( sizeof ( LISTCOM ) * MAXSYSCOM ) ;
do {
nexttok ( ) ;
if ( tok = = tk_id | | tok = = tk_ID ) {
strncpy ( ( listcom + sysnumcom ) - > name , ( char * ) string , 32 ) ;
( listcom + sysnumcom ) - > name [ 32 ] = 0 ;
sysnumcom + + ;
}
else {
idalreadydefined ( ) ;
break ;
}
nexttok ( ) ;
if ( tok = = tk_semicolon ) break ;
if ( tok ! = tk_camma ) {
expected ( ' , ' ) ;
break ;
}
} while ( sysnumcom < = MAXSYSCOM ) ;
if ( sysnumcom > MAXSYSCOM ) preerror ( " to many commands " ) ;
else if ( sysnumcom ! = 0 & & sysnumcom ! = MAXSYSCOM ) listcom = ( LISTCOM * ) REALLOC ( listcom , sysnumcom * sizeof ( LISTCOM ) ) ;
break ;
case d_sdp : //<2F> <> <EFBFBD> <EFBFBD> 㧨<EFBFBD> <E3A7A8> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ᪨<EFBFBD> <20> <> <EFBFBD> 楤<EFBFBD> <E6A5A4> <EFBFBD>
next = notdoneprestuff ;
sdp_mode = TRUE ;
usedirectiv = FALSE ;
docalls ( ) ;
sdp_mode = FALSE ;
notdoneprestuff = next ;
next = 1 ;
break ;
case d_warning :
warning = get_directive_value ( ) ;
next = 0 ;
break ;
case d_ip :
if ( GetStringAsIt ( ) ! = - 1 ) IncludePath ( ( char * ) string3 ) ;
break ;
case d_us : //<2F> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> STARTUP
if ( comfile = = file_com ) useStartup = TRUE ;
break ;
case d_suv : //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 砫<EFBFBD> <20> ᯮ<EFBFBD> 짮<EFBFBD> <ECA7AE> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 樠<EFBFBD> <E6A8A0> <EFBFBD> <EFBFBD> <EFBFBD> <E0AEA2> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD> <EFBFBD>
nexttok ( ) ;
if ( comfile = = file_com ) {
if ( tok = = tk_number ) startStartup = doconstlongmath ( ) ;
else {
numexpected ( ) ;
nexttok ( ) ;
}
next = 0 ;
}
else OnlyComFile ( ) ;
break ;
case d_iav : //<2F> <> <EFBFBD> 樠<EFBFBD> <E6A8A0> <EFBFBD> <EFBFBD> <EFBFBD> <E0AEA2> <EFBFBD> <20> <> <EFBFBD> <20> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD> <EFBFBD>
notpost = get_directive_value ( ) ;
next = 0 ;
break ;
case d_atex : //<2F> <> 堭<EFBFBD> <E5A0AD> <EFBFBD> ATEXIT
atex = TRUE ;
break ;
case d_dseg : //ᥣ<> <E1A5A3> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> rom-bios
nexttok ( ) ;
if ( tok = = tk_number ) {
dataseg = doconstlongmath ( ) ;
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_rsize : //ࠧ<> <E0A0A7> <EFBFBD> rom-bios
nexttok ( ) ;
if ( tok = = tk_number ) {
romsize = doconstlongmath ( ) ;
next = 0 ;
}
else numexpected ( ) ;
break ;
case d_mdr : //<2F> <> ७<EFBFBD> <E0A5AD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
splitdata = modelmem = get_directive_value ( ) ;
next = 0 ;
break ;
case d_am32 : //32 <20> <> ⭠<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
nexttok ( ) ;
if ( tok ! = tk_number ) numexpected ( ) ;
else am32 = ( unsigned char ) ( itok . number = = 0 ? FALSE : TRUE ) ;
break ;
case d_undef : //undef
oscanlexmode = scanlexmode ;
scanlexmode = DEFLEX2 ;
nexttok ( ) ;
scanlexmode = oscanlexmode ;
// retoldscanmode(oscanlexmode);
if ( tok = = tk_string ) {
strcpy ( itok . name , ( char * ) string ) ;
KillVarOfTree ( & treestart ) ;
}
else KillVarOfTree ( & definestart ) ;
break ;
case d_stm : //startuptomain
startuptomain = TRUE ;
break ;
case d_ib : //imagebase
nexttok ( ) ;
ImageBase = doconstlongmath ( ) ;
next = 0 ;
break ;
case d_fut : //fixuptable
FixUpTable = get_directive_value ( ) ;
next = 0 ;
break ;
case d_fca : //fastcallapi
FastCallApi = get_directive_value ( ) ;
next = 0 ;
break ;
case d_dstr :
dosstring = get_directive_value ( ) ;
next = 0 ;
break ;
case d_cv :
int v1 , v2 ;
v1 = v2 = 0 ;
cha = cha2 ;
inptr = inptr2 ;
linenumber = linenum2 ;
whitespace ( ) ; //<2F> ய<EFBFBD> <E0AEAF> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ᨬ<> <E1A8AC> <EFBFBD> <EFBFBD> <EFBFBD>
while ( isdigit ( cha ) ) {
v1 = v1 * 10 + ( cha - ' 0 ' ) ;
nextchar ( ) ;
}
if ( cha ! = ' . ' ) expected ( ' . ' ) ;
nextchar ( ) ;
i = 0 ;
while ( isdigit ( cha ) ) {
v2 = v2 * 10 + ( cha - ' 0 ' ) ;
nextchar ( ) ;
i + + ;
}
while ( i < 3 ) {
v2 = v2 * 10 ;
i + + ;
}
cha2 = cha ;
inptr2 = inptr ;
linenum2 = linenumber ;
if ( v1 > = ver1 ) {
if ( v1 = = ver1 & & v2 < = ver2 ) break ;
}
sprintf ( ( char * ) string , " needed compiler version %0u.%03u or best " , v1 , v2 ) ;
preerror ( ( char * ) string ) ;
break ;
case d_else :
if ( endifcount = = - 1 ) preerror ( " #else without preceeding #if " ) ;
else if ( ( useelse [ endifcount ] & 1 ) = = 0 ) preerror ( toelse ) ;
else useelse [ endifcount ] & = 0xFE ;
if ( gotoendif = = 1 ) gotoendif = 0 ;
else gotoendif = 1 ;
break ;
case d_elif :
if ( endifcount = = - 1 ) preerror ( " #elif without preceeding #if " ) ;
doifdef ( d_elif ) ;
next = 0 ;
gotoendif = 1 ;
break ;
case d_wmb : //<2F> <> ନ<E0ACA8> <E0AEA2> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> win
WinMonoBlock = get_directive_value ( ) ;
next = 0 ;
break ;
case d_pragma :
char * ptr ;
inptr = inptr2 ;
cha = cha2 ;
FastTok ( 1 ) ;
// printf("%c %s\n",cha,itok.name);
i = 0 ;
while ( cha ! = 13 & & cha ! = 26 ) {
if ( cha = = ' / ' ) {
if ( input [ inptr ] = = ' / ' ) {
while ( cha ! = 13 & & cha ! = 26 ) nextchar ( ) ;
break ;
}
if ( input [ inptr ] = = ' * ' ) {
while ( cha ! = 26 ) {
nextchar ( ) ;
if ( cha = = ' * ' & & input [ inptr ] = = ' / ' ) {
nextchar ( ) ;
nextchar ( ) ;
break ;
}
if ( cha = = 13 ) linenumber + + ;
}
break ;
}
}
string [ i + + ] = cha ;
nextchar ( ) ;
}
cha2 = cha ;
inptr2 = inptr ;
linenum2 = linenumber ;
string [ i ] = 0 ;
strbtrim ( ( char * ) string ) ;
// printf("%s %s\n",itok.name,string);
if ( strlen ( ( char * ) string ) ) ptr = BackString ( ( char * ) string ) ;
else ptr = NULL ;
for ( i = 0 ; i < p_end ; i + + ) if ( strcmp ( itok . name , pragmalist [ i ] ) = = 0 ) break ;
if ( i ! = p_li & & ptr = = NULL ) {
unknownpragma ( pragmalist [ i ] ) ;
break ;
}
switch ( i ) {
case p_op :
SelectComand ( ptr , 0 ) ;
break ;
case p_li :
printf ( " %s (%u) %s \n " , ( startfileinfo + currentfileinfo ) - > filename , linenumber , ptr = = NULL ? " " : ptr ) ;
break ;
case p_st :
i = 0 ;
char c ;
do {
c = ptr [ i + + ] ;
} while ( isalnum ( c ) | | c = = ' _ ' ) ;
ptr [ i ] = 0 ;
if ( numdomain = = 0 ) domain = ( char * ) MALLOC ( IDLENGTH ) ;
else domain = ( char * ) REALLOC ( domain , IDLENGTH * ( numdomain + 1 ) ) ;
strcpy ( domain + numdomain * IDLENGTH , ptr ) ;
numdomain + + ;
break ;
case p_re :
if ( strcmp ( ptr , " start " ) = = 0 ) {
scanlexmode = RESLEX ;
input_res ( ) ;
}
else if ( strcmp ( ptr , " end " ) = = 0 )
scanlexmode = STDLEX ;
// retoldscanmode(STDLEX);
else preerror ( " for '#pragma resource' used only 'start' or 'end' " ) ;
break ;
case p_db :
# ifdef DEBUGMODE
if ( strcmp ( ptr , " start " ) = = 0 ) {
debug = TRUE ;
}
else if ( strcmp ( ptr , " end " ) = = 0 ) debug = FALSE ;
else unknownpragma ( " debug " ) ;
# endif
break ;
case p_pa :
// printf("ptr=%08X input=%08X tok=%d\n",ptr,input,tok);
SetNewStr ( ptr ) ;
displaytokerrors = 1 ;
FastTok ( 1 ) ;
if ( tok ! = tk_openbracket ) {
expected ( ' ( ' ) ;
break ;
}
FastTok ( 1 ) ;
if ( tok = = tk_closebracket ) strpackcur = strpackdef ;
i = 0 ;
STACKALIGN * newpar ;
while ( tok ! = tk_closebracket & & tok ! = tk_eof ) {
switch ( tok ) {
case tk_number :
if ( caselong ( itok . number ) = = NUMNUM ) {
preerror ( " bad align size " ) ;
break ;
}
if ( pushpop ( i ) ) i = 3 ;
strpackcur = itok . number ;
break ;
case tk_id :
if ( strcmp ( itok . name , " push " ) = = 0 ) {
if ( i ) unknownpragma ( " pack(push) " ) ;
i = 1 ;
}
else if ( strcmp ( itok . name , " pop " ) = = 0 ) {
if ( i ) unknownpragma ( " pack(pop) " ) ;
i = 2 ;
}
else if ( strcmp ( itok . name , " show " ) = = 0 ) {
printf ( " %s (%u) Current packing alignment for structure = %d \n " , ( startfileinfo + currentfileinfo ) - > filename , linenumber , strpackcur ) ;
i = 3 ;
}
else {
switch ( i ) {
case 0 :
unknownpragma ( " pack " ) ;
break ;
case 1 :
newpar = ( STACKALIGN * ) MALLOC ( sizeof ( STACKALIGN ) ) ;
newpar - > prev = stackalign ;
newpar - > size = strpackcur ;
strcpy ( newpar - > id , itok . name ) ;
stackalign = newpar ;
i = 3 ;
break ;
case 2 :
while ( stackalign ! = NULL & & strcmp ( itok . name , stackalign - > id ) ! = 0 ) {
newpar = stackalign - > prev ;
free ( stackalign ) ;
stackalign = newpar ;
}
if ( stackalign = = NULL ) {
strpackcur = strpackdef ;
warpragmapackpop ( ) ;
break ;
}
newpar = stackalign - > prev ;
free ( stackalign ) ;
stackalign = newpar ;
strpackcur = ( stackalign = = NULL ? strpackdef : stackalign - > size ) ;
i = 3 ;
break ;
default :
unknownpragma ( " pack " ) ;
break ;
}
}
}
FastTok ( 1 ) ;
if ( tok = = tk_camma ) FastTok ( 1 ) ;
}
pushpop ( i ) ;
// printf("ptr=%08X input=%08X tok=%d\n",ptr,input,tok);
inptr2 = inptr ;
cha2 = cha ;
while ( ptr = = ( char * ) input ) nexttok ( ) ;
next = 0 ;
break ;
case p_idx :
SetNewStr ( ptr ) ;
inptr2 = 1 ;
InitIdxRegs ( ) ;
next = 0 ;
break ;
default :
unknownpragma ( " " ) ;
break ;
}
if ( ptr ) free ( ptr ) ;
break ;
case d_inline :
nexttok ( ) ;
if ( tok = = tk_number ) {
if ( itok . number > = 0 & & itok . number < = 2 ) useinline = itok . number ;
else preerror ( ido ) ;
}
else if ( strcmp ( itok . name , " AUTO " ) = = 0 ) useinline = 2 ;
else preerror ( ido ) ;
break ;
default :
preerror ( " compiler directive expected " ) ;
}
if ( next ) nexttok ( ) ;
while ( gotoendif ) {
if ( tok = = tk_question ) {
if ( itok . number = = d_endif ) {
gotoendif - - ;
endifcount - - ;
// printf("%s (%u) endif shadow: endifcount=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,endifcount);
}
else if ( itok . number = = d_ifdef | | itok . number = = d_ifndef | | itok . number = = d_if ) {
gotoendif + + ;
endifcount + + ;
// printf("%s (%u) if shadow: endifcount=%d\n",(startfileinfo+currentfileinfo)->filename,linenumber,endifcount);
CheckNumIF ( ) ;
useelse [ endifcount ] = 1 ;
}
else if ( itok . number = = d_else ) {
if ( ( useelse [ endifcount ] & 1 ) = = 0 ) preerror ( toelse ) ;
else useelse [ endifcount ] & = 0xFE ;
if ( gotoendif = = 1 & & useelse [ endifcount ] = = 0 ) {
gotoendif = 0 ;
useelse [ endifcount ] | = 2 ;
}
}
else if ( itok . number = = d_elif ) {
if ( gotoendif = = 1 ) {
doifdef ( d_elif ) ;
if ( gotoendif = = 0 ) {
if ( ( useelse [ endifcount ] & 2 ) = = 0 ) {
useelse [ endifcount ] | = 2 ;
break ;
}
gotoendif = 1 ;
}
}
}
}
else if ( tok = = tk_eof ) {
unexpectedeof ( ) ;
break ;
}
if ( gotoendif ) FindDirectiv ( ) ;
else {
nexttok ( ) ;
break ;
}
}
usedirectiv = FALSE ;
dirmode = dm_none ;
}
void doenum ( )
{
long counter = 0 ;
unsigned char next ;
char holdid [ IDLENGTH ] ;
nexttok ( ) ;
if ( tok ! = tk_openbrace ) {
if ( tok2 ! = tk_openbrace ) expected ( ' { ' ) ;
nexttok ( ) ;
}
do {
next = 1 ;
nexttok ( ) ;
switch ( tok ) {
case tk_ID :
case tk_id :
strcpy ( holdid , ( char * ) string ) ;
if ( tok2 = = tk_assign ) {
nexttok ( ) ;
nexttok ( ) ;
CheckMinusNum ( ) ;
if ( tok = = tk_number ) {
counter = doconstlongmath ( ) ;
next = 0 ;
postnumflag = 0 ;
}
else numexpected ( ) ;
}
addconsttotree ( holdid , counter ) ;
counter + + ;
break ;
case tk_closebrace :
next = 0 ;
break ;
default :
idalreadydefined ( ) ;
break ;
}
if ( next ) nexttok ( ) ;
} while ( tok = = tk_camma ) ;
if ( tok ! = tk_closebrace ) expected ( ' } ' ) ;
nextseminext ( ) ;
}
int CompConst ( int firstval )
{
int otok = tok ;
nexttok ( ) ;
if ( tok ! = tk_number ) unknowncompop ( ) ;
switch ( otok ) {
case tk_equalto :
if ( firstval = = itok . number ) return TRUE ;
break ;
case tk_notequal :
if ( firstval ! = itok . number ) return TRUE ;
break ;
case tk_greater :
if ( firstval > itok . number ) return TRUE ;
break ;
case tk_less :
if ( firstval < itok . number ) return TRUE ;
break ;
case tk_greaterequal :
if ( firstval > = itok . number ) return TRUE ;
break ;
case tk_lessequal :
if ( firstval < = itok . number ) return TRUE ;
break ;
default : unknowncompop ( ) ;
}
return FALSE ;
}
int ifdefconst ( )
{
if ( optimizespeed = = TRUE ) {
if ( strcmp ( ( char * ) string , " speed " ) = = 0 ) return TRUE ;
}
else if ( strcmp ( ( char * ) string , " codesize " ) = = 0 ) return TRUE ;
if ( strcmp ( ( char * ) string , " cpu " ) = = 0 ) {
nexttok ( ) ;
return CompConst ( chip ) ;
}
if ( itok2 . type = = tp_compare ) {
// unknowncompop();
nexttok ( ) ;
nexttok ( ) ;
return FALSE ;
}
if ( comfile = = file_w32 & & strcmp ( ( char * ) string , " _WIN32 " ) = = 0 ) return TRUE ;
if ( * ( short * ) & string [ 0 ] = = 0x5F5F ) {
if ( comfile = = file_w32 ) {
if ( strcmp ( ( char * ) string + 2 , " TLS__ " ) = = 0 ) return TRUE ;
if ( dllflag & & strcmp ( ( char * ) string + 2 , " DLL__ " ) = = 0 ) return TRUE ;
else {
if ( wconsole & & strcmp ( ( char * ) string + 2 , " CONSOLE__ " ) = = 0 ) return TRUE ;
else if ( strcmp ( ( char * ) string + 2 , " WIN32__ " ) = = 0 ) return TRUE ;
}
}
if ( am32 ) {
if ( strcmp ( ( char * ) string + 2 , " FLAT__ " ) = = 0 ) return TRUE ;
}
else {
if ( strcmp ( ( char * ) string + 2 , " MSDOS__ " ) = = 0 ) return TRUE ;
if ( modelmem = = TINY & & strcmp ( ( char * ) string + 2 , " TINY__ " ) = = 0 ) return TRUE ;
if ( modelmem = = SMALL & & strcmp ( ( char * ) string + 2 , " SMALL__ " ) = = 0 ) return TRUE ;
}
if ( comfile = = file_d32 & & strcmp ( ( char * ) string + 2 , " DOS32__ " ) = = 0 ) return TRUE ;
if ( comfile = = file_com & & strcmp ( ( char * ) string + 2 , " COM__ " ) = = 0 ) return TRUE ;
if ( comfile = = file_sys & & strcmp ( ( char * ) string + 2 , " SYS__ " ) = = 0 ) return TRUE ;
if ( comfile = = file_rom & & strcmp ( ( char * ) string + 2 , " ROM__ " ) = = 0 ) return TRUE ;
if ( comfile = = file_bin & & strcmp ( ( char * ) string + 2 , " BIN32__ " ) = = 0 ) return TRUE ;
if ( comfile = = file_meos & & strcmp ( ( char * ) string + 2 , " MEOS__ " ) = = 0 ) return TRUE ;
if ( ( sobj | | fobj ) & & strcmp ( ( char * ) string + 2 , " OBJ__ " ) = = 0 ) return TRUE ;
2022-02-07 10:45:44 +01:00
// Added by Coldy (for mark MSCOFF build)
if ( ( ocoff & & sobj ) & & strcmp ( ( char * ) string + 2 , " COFF__ " ) = = 0 ) return TRUE ;
2016-06-13 04:07:22 +02:00
if ( comfile = = file_exe ) {
if ( modelmem = = TINY ) {
if ( strcmp ( ( char * ) string + 2 , " TEXE__ " ) = = 0 ) return TRUE ;
}
else if ( strcmp ( ( char * ) string + 2 , " EXE__ " ) = = 0 ) return TRUE ;
}
}
return 2 ;
}
void CheckNumIF ( )
{
if ( endifcount > = NUMIFDEF ) preerror ( " #ifdef/#ifndef - too large enclosure " ) ;
}
static int firstincl = FALSE ;
void IncludeFile ( char * fileincl , int tfind )
{
unsigned char * holdinput ;
unsigned int holdinptr , holdendinptr , holdlinenum ;
unsigned char holdwarning ;
unsigned char holdcha , holdendoffile ;
int ofileinfo ;
char * ostartline ;
int oscanlexmode = scanlexmode ;
int opostnumflag ;
COM_MOD * ocurmod = cur_mod ;
int oendifcount ;
oendifcount = endifcount ;
cur_mod = NULL ;
if ( ! firstincl ) {
firstincl = TRUE ;
if ( ( dbg & 1 ) & & am32 = = FALSE ) {
holdcha = dbgact ;
dbgact = 0 ;
AddLine ( ) ;
dbgact = holdcha ;
}
}
scanlexmode = STDLEX ;
opostnumflag = postnumflag ;
holdinput = input ; //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD>
holdinptr = inptr2 ;
holdcha = cha2 ;
holdlinenum = linenum2 ;
holdendinptr = endinptr ;
holdendoffile = endoffile ;
holdwarning = warning ;
ostartline = startline ;
ofileinfo = currentfileinfo ;
( startfileinfo + currentfileinfo ) - > stlist = staticlist ;
compilefile ( fileincl , tfind ) ; //<2F> ⪮<EFBFBD> <E2AAAE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <E0AEA2> <EFBFBD>
if ( endifcount ! = oendifcount ) {
sprintf ( ( char * ) string2 , " num if prior %d after %d " , oendifcount , endifcount ) ;
preerror ( ( char * ) string2 ) ;
}
// (startfileinfo+currentfileinfo)->staticlist=staticlist;
currentfileinfo = ofileinfo ;
staticlist = ( startfileinfo + currentfileinfo ) - > stlist ;
warning = holdwarning ;
endoffile = holdendoffile ; //<2F> <> <EFBFBD> ⠭<EFBFBD> <E2A0AD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ६<EFBFBD> <E0A5AC> <EFBFBD> <EFBFBD>
endinptr = holdendinptr ;
input = holdinput ;
inptr2 = holdinptr ;
cha2 = holdcha ;
linenumber = linenum2 = holdlinenum ;
startline = ostartline ;
// retoldscanmode(oscanlexmode);
scanlexmode = oscanlexmode ;
postnumflag = opostnumflag ;
cur_mod = ocurmod ;
}
/*-----------------31.05.99 21:39-------------------
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> প <EFBFBD> startup
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
int startlabl ( char * namelab )
{
//ITOK btok;
//int bb;
// if(searchtree(&btok,&bb,(unsigned char *)namelab)==FALSE)thisundefined(namelab);
searchvar ( namelab ) ;
return itok . number ;
}
void searchvar ( char * name , int err )
{
strcpy ( ( char * ) string , name ) ;
if ( searchtree ( & itok , & tok , string ) = = FALSE & & err ) thisundefined ( name ) ;
}
void doprestuff ( ) //<2F> <> <EFBFBD> 樠<EFBFBD> <E6A8A0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> 砫쭮<E7A0AB> <ECADAE> <20> <> <EFBFBD> <EFBFBD> , like resize mem, jump to main...
{
ITOK oitok ;
int otok , otok2 ;
unsigned int addresshold ;
unsigned char ojmp ;
char * bstring ;
int odbg = dbg ;
//<2F> <> <EFBFBD> ࠭<EFBFBD> <E0A0AD> <EFBFBD> <20> <> ࠬ<EFBFBD> <E0A0AC> <EFBFBD> <EFBFBD>
// if(FixUp==TRUE||comfile==file_w32)optnumber=FALSE;
oitok = itok ;
bstring = BackString ( ( char * ) string ) ;
otok = tok ;
ojmp = 0xff ;
otok2 = tok2 ;
// printf("tok=%d inptr=%d\n",tok,inptr);
if ( notdoneprestuff = = TRUE ) {
if ( splitdata ) startptrdata = 0 ;
if ( comfile ! = file_w32 | | ( dbg & 2 ) ) dbgact = 0 ;
}
if ( startuptomain = = TRUE & & comfile = = file_com ) {
if ( notdoneprestuff = = TRUE ) {
outptr = startptr ;
outptrdata = startptrdata ;
if ( jumptomain ! = CALL_NONE ) {
tok = tk_ID ;
strcpy ( itok . name , mesmain ) ;
tobedefined ( jumptomain = = CALL_NEAR ? JMP_NEAR : CALL_SHORT , tk_void ) ; /* put main on the to be defined stack */
if ( jumptomain = = CALL_NEAR ) jumploc0 ( ) ;
else outword ( 0x00EB ) ; // JMP short
}
endStartup = outptr ;
notdoneprestuff = FALSE ;
goto endp ;
}
else {
header = 0 ; //<2F> ⮡ <20> <> <20> 뫮 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ୮<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> sphinx
ojmp = jumptomain ;
jumptomain = CALL_NONE ;
startuptomain = FALSE ;
}
}
else if ( comsymbios = = FALSE ) {
outptr = startptr ;
outptrdata = startptrdata ;
}
notdoneprestuff = FALSE ;
if ( comfile = = file_meos ) outptrdata = outptr = startptr + sizeof ( MEOSheader ) ;
if ( sobj ) {
outptrdata = outptr = startptrdata = startptr = 0 ;
goto endp ;
}
itok . post = 1 ;
itok . segm = DS ;
itok . number = 0 ;
itok . flag = 0 ;
itok . size = 0 ;
itok . rm = ( am32 = = FALSE ? rm_d16 : rm_d32 ) ;
tok = ( am32 = = 0 ? tk_wordvar : tk_dwordvar ) ;
string [ 0 ] = 0 ;
addtotree ( " __startpostvar " ) ;
itok . rec - > count = 1 ;
if ( comfile = = file_bin ) goto endp ;
else ImageBase = Align ( ImageBase , 0x10000 ) ;
if ( jumptomain = = CALL_NONE ) {
if ( comfile = = file_w32 | | comfile = = file_exe | | comfile = = file_meos ) goto endp ;
if ( comfile = = file_com & & fargc = = 0 & & parsecommandline = = 0 & & atex = = 0 & & use_env = = 0
& & clearpost = = 0 & & resizemem = = 0 & & killctrlc = = 0 ) goto endp ;
}
if ( comfile = = file_sys ) {
addconsttotree ( " __SYSATRIB " , sysatr ) ;
tok = tk_string ;
itok . number = 8 ;
itok . flag = zero_term ;
strncpy ( ( char * ) string , sysname , 8 ) ;
addtotree ( " __SYSNAME " ) ;
if ( sysstack ! = 0 ) {
addconsttotree ( " __SYSSTACK " , sysstack ) ;
}
if ( sysnumcom = = 0 ) preerror ( " list command expected " ) ;
else addconsttotree ( " __SYSNUMCOM " , sysnumcom ) ;
}
else if ( comfile = = file_rom ) {
resizemem = 0 ;
addconsttotree ( " __ROMSIZE " , romsize ) ;
addconsttotree ( " __DATASEG " , dataseg ) ;
if ( modelmem ! = SMALL ) {
free ( outputdata ) ;
outputdata = output ;
}
}
else if ( comsymbios = = TRUE ) {
addresshold = outptr ;
addconsttotree ( " __STARTPTR " , startptr ) ;
addconsttotree ( " __STARTVALW " , * ( unsigned short * ) & output [ startptr ] ) ;
addconsttotree ( " __STARTVALB " , output [ startptr + 2 ] ) ;
}
if ( comfile = = file_w32 & & wbss ) clearpost = FALSE ;
if ( resizemem ) addconsttotree ( " __resizemem " , TRUE ) ;
if ( killctrlc ) addconsttotree ( " __ctrl_c " , TRUE ) ;
if ( parsecommandline ) addconsttotree ( " __parsecommandline " , TRUE ) ;
if ( atex ) addconsttotree ( " __atexit " , TRUE ) ;
if ( fargc ) addconsttotree ( " __argc " , TRUE ) ;
if ( use_env ) addconsttotree ( " __environ " , TRUE ) ;
if ( clearpost ) addconsttotree ( " __clearpost " , TRUE ) ;
if ( comfile = = file_d32 ) {
if ( useDOS4GW ) addconsttotree ( " __useDOS4GW " , TRUE ) ;
if ( dpmistub & & ( ! usestub ) ) {
addconsttotree ( " __DPMIonly " , TRUE ) ;
resizemem = TRUE ;
jumptomain = CALL_NEAR ;
}
}
if ( jumptomain = = CALL_SHORT ) addconsttotree ( " __shortjmp " , TRUE ) ;
else if ( jumptomain = = CALL_NONE ) addconsttotree ( " __nonejmptomain " , TRUE ) ;
if ( dbg ) {
if ( am32 = = FALSE ) {
if ( firstincl = = FALSE ) {
firstincl = TRUE ;
AddLine ( ) ;
}
dbg = 0 ;
}
}
IncludeFile ( namestartupfile , 0 ) ;
dbg = odbg ;
if ( ( dbg & 1 ) & & outptr = = startptr ) KillLastLine ( ) ;
if ( atex | | ( comfile = = file_w32 & & ( ! dllflag ) ) ) {
startexit = startlabl ( " __startexit " ) ;
if ( ojmp = = 0xff ) endStartup = startexit ;
}
else if ( ojmp = = 0xff ) endStartup = outptr ;
if ( sobj = = FALSE & & fobj = = FALSE & & //new 18.04.07 23:52
comfile = = file_com ) {
if ( resizemem ) {
resizesizeaddress = startlabl ( " __stackseg " ) ;
stackstartaddress = startlabl ( " __stackval " ) ;
}
}
else if ( comfile = = file_sys ) {
syscom = startlabl ( " __listcom " ) ;
}
else if ( comfile = = file_rom ) {
if ( modelmem = = SMALL ) {
stackstartaddress = startlabl ( " __stackstart " ) ;
dataromstart = startlabl ( " __startdata " ) ;
dataromsize = startlabl ( " __sizedata " ) ;
}
else {
useStartup = TRUE ;
endStartup = 0xfff0 ;
startStartup = 0 ;
}
}
if ( comsymbios = = TRUE ) {
output [ startptr ] = 0xE9 ;
addresshold = addresshold - ( startptr + 3 ) ; /* inital */
* ( unsigned short * ) & output [ startptr + 1 ] = ( unsigned short ) addresshold ;
}
if ( ojmp ! = 0xff ) jumptomain = ojmp ;
endp :
if ( header ) {
outprocedure ( aabaner , MMBANER ) ;
alignersize + = MMBANER ;
}
itok = oitok ;
tok = otok ;
tok2 = otok2 ;
strcpy ( ( char * ) string , bstring ) ;
free ( bstring ) ;
if ( strcmp ( itok . name , mesmain ) = = 0 ) searchtree ( & itok , & tok , ( unsigned char * ) & string ) ;
if ( ( comfile ! = file_d32 | | dpmistub ) & & stubfile ! = NULL ) {
free ( stubfile ) ;
stubfile = NULL ;
}
dbgact = 0 ;
}
void KillVarOfTree ( idrec * * treestart )
{
struct idrec * ptr , * leftptr , * rightptr , * prev ;
int cmpresult , ocmpresult = 0 ;
ptr = * treestart ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD>
while ( ptr ! = NULL & & ( cmpresult = strcmp ( ptr - > recid , itok . name ) ) ! = 0 ) {
prev = ptr ; //த<> ⥫<EFBFBD>
ocmpresult = cmpresult ; //१<> <E0A5A7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> । <20> ࠢ<EFBFBD> <E0A0A2> <EFBFBD> <EFBFBD> <EFBFBD> - <20> <> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> ࠢ<EFBFBD> <E0A0A2> <20> <> ⢨
if ( cmpresult < 0 ) ptr = ptr - > left ;
else ptr = ptr - > right ;
}
if ( ptr ! = NULL ) { //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ꥪ<EFBFBD> 㤠<> <E3A4A0> <EFBFBD> <EFBFBD> <EFBFBD>
if ( ptr - > newid ) free ( ptr - > newid ) ; //㤠<> <E3A4A0> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
leftptr = ptr - > left ; //<2F> <> <EFBFBD> <EFBFBD>
rightptr = ptr - > right ; //<2F> <> 㣮<EFBFBD> <20> <> <EFBFBD> <EFBFBD>
if ( leftptr = = NULL & & rightptr = = NULL ) { //<2F> <20> <> <EFBFBD> <20> <> ⥩
if ( ocmpresult < 0 ) prev - > left = NULL ; //<2F> <> த<> ⥫<EFBFBD> <20> <> ⠫<EFBFBD> <E2A0AB> <20> <> <EFBFBD> <EFBFBD> ⮩
else if ( ocmpresult > 0 ) prev - > right = NULL ;
else * treestart = NULL ; //㤠<> <E3A4A0> <EFBFBD> <20> <> ७<EFBFBD> <20> <> <EFBFBD> <20> <> ⢥<EFBFBD>
}
else if ( leftptr = = NULL ) { //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> ࠢ<EFBFBD>
if ( ocmpresult < 0 ) prev - > left = rightptr ; //<2F> <> ।<EFBFBD> <E0A5A4> <EFBFBD> <20> <> 㪮<EFBFBD> த<> ⥫<EFBFBD>
else if ( ocmpresult > 0 ) prev - > right = rightptr ;
else * treestart = rightptr ; //㤠<> <E3A4A0> <EFBFBD> <20> <> ७<EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> ࠢ<EFBFBD> <E0A0A2> <20> <> ⪮<EFBFBD>
}
else if ( rightptr = = NULL ) { //⮦<> <20> <20> <> <EFBFBD> <EFBFBD> <> <E1ABA5>
if ( ocmpresult < 0 ) prev - > left = leftptr ;
else if ( ocmpresult > 0 ) prev - > right = leftptr ;
else * treestart = leftptr ; //㤠<> <E3A4A0> <EFBFBD> <20> <> ७<EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> ⪮<EFBFBD>
}
else { //<2F> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ॡ<> <E0A5A1> <EFBFBD> <EFBFBD>
struct idrec * ostptr , * ptrf ;
if ( ocmpresult < 0 ) { //<2F> <20> <> <20> <> <EFBFBD> <EFBFBD> <> <E1ABA5>
prev - > left = leftptr ; //<2F> <> ।<EFBFBD> <E0A5A4> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ॡ<> <E0A5A1> <EFBFBD> <EFBFBD>
ostptr = rightptr ; //<2F> ࠢ<EFBFBD> <E0A0A2> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD>
}
else if ( ocmpresult > 0 ) { //<2F> <20> <> <20> <> <20> <> <EFBFBD> <EFBFBD> <20> <> ࠢ<EFBFBD>
prev - > right = rightptr ; //<2F> <> ।<EFBFBD> <E0A5A4> <EFBFBD> <20> ࠢ<EFBFBD> <E0A0A2> <EFBFBD> ॡ<> <E0A5A1> <EFBFBD> <EFBFBD>
ostptr = leftptr ; //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
else { //<2F> <20> <20> <> <EFBFBD> <20> <> <EFBFBD> த<> ⥫<EFBFBD>
* treestart = rightptr ; //<2F> <> <EFBFBD> <EFBFBD> <20> <> 㣠<EFBFBD> <20> ⠭<EFBFBD> <E2A0AD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
ostptr = leftptr ; //<2F> <> 㣮<EFBFBD> <E3A3AE> <20> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
ptrf = * treestart ; //<2F> <> 砫<EFBFBD> <20> <> ॢ<EFBFBD>
while ( ( ( cmpresult = strcmp ( ptrf - > recid , ostptr - > recid ) ) < 0 & & ptrf - > left ! = NULL ) | |
( cmpresult > 0 & & ptrf - > right ! = NULL ) ) {
if ( cmpresult < 0 ) ptrf = ptrf - > left ;
else ptrf = ptrf - > right ;
}
if ( cmpresult < 0 ) ptrf - > left = ostptr ; //<2F> <> ப<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
else ptrf - > right = ostptr ;
}
if ( ptr - > newid ) free ( ptr - > newid ) ;
if ( ptr - > sbuf ) free ( ptr - > sbuf ) ;
free ( ptr ) ;
}
}
/* end of TOKE.C */