// forms: #pragma warning # level (change message # to have level "level) // : #pragma warning * level (change all messages to have level "level) // // - "level" must be digit (0-9) // - "level==0" implies warning will be treated as an error // static bool pragWarning( // PROCESS #PRAGMA WARNING void ) { unsigned msgnum; // - message number int level; // - new level bool change_all; // - true ==> change all levels bool error_occurred; // - true ==> error has occurred error_occurred = false; if( CurToken == T_TIMES ) { change_all = true; } else if( CurToken == T_CONSTANT ) { msgnum = U32Fetch( Constant64 ); change_all = false; } else { // ignore; MS or other vendor's #pragma return( true ); } NextToken(); if( CurToken == T_CONSTANT ) { level = U32Fetch( Constant64 ); } else { CErr1( ERR_PRAG_WARNING_BAD_LEVEL ); error_occurred = true; } NextToken(); if( ! error_occurred ) { if( change_all ) { WarnChangeLevels( level ); } else { WarnChangeLevel( level, msgnum ); } } return( false ); }
static void ensureBufferReflectsCurToken( void ) { if( TokenUsesBuffer( CurToken ) ) { if( CurToken == T_CONSTANT ) { switch( ConstType ) { case TYP_UCHAR: case TYP_UINT: case TYP_ULONG: ultoa( U32Fetch( Constant64 ), Buffer, 10 ); break; case TYP_SCHAR: case TYP_SINT: case TYP_SLONG: ltoa( U32Fetch( Constant64 ), Buffer, 10 ); break; case TYP_ULONG64: case TYP_SLONG64: sti64cpy( Buffer, Constant64 ); break; } } } else { strcpy( Buffer, Tokens[ CurToken ] ); } }
static void pragPack( // #PRAGMA PACK void ) { if( ExpectingToken( T_LEFT_PAREN ) ) { PPCTL_ENABLE_MACROS(); NextToken(); PPCTL_DISABLE_MACROS(); switch( CurToken ) { case T_ID: if( PragIdRecog( "pop" ) ) { popPrag( &HeadPacks, &PackAmount ); } else if( PragIdRecog( "push" ) ) { if( CurToken == T_RIGHT_PAREN ) { pushPrag( &HeadPacks, PackAmount ); } else { if( ExpectingToken( T_COMMA ) ) { PPCTL_ENABLE_MACROS(); NextToken(); PPCTL_DISABLE_MACROS(); } if( CurToken == T_CONSTANT ) { pushPrag( &HeadPacks, PackAmount ); PackAmount = VerifyPackAmount( U32Fetch( Constant64 ) ); NextToken(); } else { MustRecog( T_CONSTANT ); } } } else { CErr( ERR_EXPECTING_BUT_FOUND, "push or pop", Buffer ); } break; case T_CONSTANT: PackAmount = VerifyPackAmount( U32Fetch( Constant64 ) ); NextToken(); break; case T_RIGHT_PAREN: PackAmount = GblPackAmount; break; default: break; } MustRecog( T_RIGHT_PAREN ); } }
static bool grabNum( unsigned *val ) { if( CurToken == T_CONSTANT ) { *val = U32Fetch( Constant64 ); NextToken(); return( true ); } if( CurToken == T_LEFT_PAREN ) { NextToken(); if( CurToken == T_CONSTANT ) { *val = U32Fetch( Constant64 ); NextToken(); MustRecog( T_RIGHT_PAREN ); return( true ); } } NextToken(); return( false ); }
// forms: #pragma initialize [before/after]* priority // // where priority is: // - number 0 - 255 // - library (32) // - program (64) // // The pragma is used to set the initialize priority for the module ( when // it occurs at file scope) or to specify an initialization function to // be called (when it occurs within a function). // // The function must be previously declared to have no parameters and to // be static. // static void pragInitialize( // #pragma initialize ... void ) { int adjust; // - before/after adjustment unsigned priority; // - initialization priority unsigned test; adjust = 0; for( ; ; ) { /* allow "before before library" */ if( PragRecog( "after" ) ) { ++adjust; } else if( PragRecog( "before" ) ) { --adjust; } else { break; } } priority = INIT_PRIORITY_PROGRAM; if( CurToken == T_CONSTANT ) { test = U32Fetch( Constant64 ); if( test <= 255 ) { priority = test; } else { CErr1( ERR_PRAG_INITIALIZE_PRIORITY ); } } else if( PragRecog( "library" ) ) { priority = INIT_PRIORITY_LIBRARY; } else if( PragRecog( "program" ) ) { priority = INIT_PRIORITY_PROGRAM; } else { CErr1( ERR_PRAG_INITIALIZE_PRIORITY ); } NextToken(); priority += adjust; if( priority > 255 ) { CErr1( ERR_PRAG_INITIALIZE_PRIORITY ); priority = INIT_PRIORITY_PROGRAM; } CompInfo.init_priority = priority; }
static int GetByteSeq( void ) { int len; char *name; unsigned offset; unsigned fixword; int uses_auto; VBUF code_buffer; #if _CPU == 8086 bool use_fpu_emu = FALSE; #endif VbufInit( &code_buffer ); AsmSysInit(); PPCTL_ENABLE_MACROS(); NextToken(); len = 0; offset = 0; name = NULL; for( ;; ) { /* reserve at least ASM_BLOCK bytes in the buffer */ VbufReqd( &code_buffer, _RoundUp( len + ASM_BLOCK, ASM_BLOCK ) ); if( CurToken == T_STRING ) { AsmCodeAddress = len; AsmCodeBuffer = VbufBuffer( &code_buffer ); #if _CPU == 8086 AsmLine( Buffer, use_fpu_emu ); use_fpu_emu = FALSE; #else AsmLine( Buffer, FALSE ); #endif len = AsmCodeAddress; NextToken(); if( CurToken == T_COMMA ) { NextToken(); } } else if( CurToken == T_CONSTANT ) { #if _CPU == 8086 if( use_fpu_emu ) { AddAFix( len, NULL, FIX_SEG, 0 ); use_fpu_emu = FALSE; } #endif VbufBuffer( &code_buffer )[ len++ ] = U32Fetch( Constant64 ); NextToken(); } else { #if _CPU == 8086 use_fpu_emu = FALSE; #endif fixword = FixupKeyword(); if( fixword == FIXWORD_NONE ) break; if( fixword == FIXWORD_FLOAT ) { #if _CPU == 8086 if( GET_FPU_EMU( CpuSwitches ) ) { use_fpu_emu = TRUE; } #endif } else { /* seg or offset */ if( !IS_ID_OR_KEYWORD( CurToken ) ) { CErr1( ERR_EXPECTING_ID ); } else { name = strsave( Buffer ); offset = 0; NextToken(); if( CurToken == T_PLUS ) { NextToken(); if( CurToken == T_CONSTANT ) { offset = U32Fetch( Constant64 ); NextToken(); } } else if( CurToken == T_MINUS ) { NextToken(); if( CurToken == T_CONSTANT ) { offset = - U32Fetch( Constant64 ); NextToken(); } } } switch( fixword ) { case FIXWORD_RELOFF: #if _CPU == 8086 AddAFix( len, name, FIX_RELOFF16, offset ); len += 2; #else AddAFix( len, name, FIX_RELOFF32, offset ); len += 4; #endif break; case FIXWORD_OFFSET: #if _CPU == 8086 AddAFix( len, name, FIX_OFF16, offset ); len += 2; #else AddAFix( len, name, FIX_OFF32, offset ); len += 4; #endif break; case FIXWORD_SEGMENT: AddAFix( len, name, FIX_SEG, 0 ); len += 2; break; } } } VbufSetLen( &code_buffer, len ); } PPCTL_DISABLE_MACROS(); uses_auto = AsmSysInsertFixups( &code_buffer ); AsmSysFini(); VbufFree( &code_buffer ); return( uses_auto ); }