static unsigned MechMisc( unsigned select, unsigned parm ) { long value; unsigned result = 0; mad_type_info mti; switch( select ) { case 0: ExprAddrDepth += parm; result = ExprAddrDepth; break; case 1: if( _IsOn( SW_EXPR_IS_CALL ) && ExprAddrDepth == 0 ) { result = TRUE; } else { result = FALSE; } break; case 2: SkipCount += parm; break; case 3: result = SkipCount; break; case 4: //never called break; case 5: if( ScanSavePtr >= MAX_SCANSAVE_PTRS ) Error( ERR_INTERNAL, LIT( ERR_TOO_MANY_SCANSAVE ) ); CurrScan[ScanSavePtr++] = ScanPos(); break; case 6: if( ScanSavePtr <= 0 ) Error( ERR_INTERNAL, LIT( ERR_TOO_MANY_SCANRESTORE ) ); ReScan( CurrScan[--ScanSavePtr] ); break; case 7: if( ScanSavePtr <= 0 ) Error( ERR_INTERNAL, LIT( ERR_TOO_MANY_SCANRESTORE ) ); --ScanSavePtr; break; case 8: if( parm ) { /* start scan string */ scan_string = TRUE; ReScan( ScanPos() ); } else { /* end scan string */ scan_string = FALSE; ReScan( ScanPos() ); } break; case 9: ReScan( ScanPos() + (int)parm ); break; case 10: AddChar(); break; case 11: AddCEscapeChar(); break; case 12: AddActualChar( '\0' ); break; case 13: ScanCCharNum = parm; break; case 14: if( NestedCallLevel == MAX_NESTED_CALL - 1 ) { Error( ERR_NONE, LIT( ERR_TOO_MANY_CALLS ) ); } else { PgmStackUsage[ ++NestedCallLevel ] = 0; } break; case 15: RValue( ExprSP ); ConvertTo( ExprSP, TK_INTEGER, TM_SIGNED, 4 ); value = U32FetchTrunc( ExprSP->v.uint ) - 1; PopEntry(); if( ExprSP->info.kind == TK_STRING ) { if( value < 0 || value >= ExprSP->info.size ) { Error( ERR_NONE, LIT( ERR_BAD_SUBSTRING_INDEX ) ); } LocationAdd( &ExprSP->v.string.loc, value*8 ); ExprSP->info.size -= value; ExprSP->v.string.ss_offset = value; } else { Error( ERR_NONE, LIT( ERR_ILL_TYPE ) ); } break; case 16: RValue( ExprSP ); ConvertTo( ExprSP, TK_INTEGER, TM_SIGNED, 4 ); value = U32FetchTrunc( ExprSP->v.sint ) - 1; PopEntry(); if( ExprSP->info.kind == TK_STRING ) { value -= ExprSP->v.string.ss_offset; if( value < 0 || value >= ExprSP->info.size ) { Error( ERR_NONE, LIT( ERR_BAD_SUBSTRING_INDEX ) ); } ExprSP->info.size = value; } else { Error( ERR_NONE, LIT( ERR_ILL_TYPE ) ); } break; case 17: EvalSubstring = parm; if( parm ) ExprSP->v.string.ss_offset = 0; break; case 18: result = EvalSubstring; break; case 19: FreePgmStack( TRUE ); break; case 20: switch( parm ) { // nyi - begin temp case SSL_CASE_SENSITIVE: _SwitchOn( SW_CASE_SENSITIVE ); break; case SSL_SIDE_EFFECT: _SwitchOn( SW_SIDE_EFFECT ); break; //case SSL_32_BIT: // _SwitchOn( SW_32_BIT ); // break; } break; case 21: switch( parm ) { case SSL_CASE_SENSITIVE: _SwitchOff( SW_CASE_SENSITIVE ); break; case SSL_SIDE_EFFECT: _SwitchOff( SW_SIDE_EFFECT ); break; //case SSL_32_BIT: // _SwitchOff( SW_32_BIT ); // break; } break; case 22: switch( parm ) { case SSL_CASE_SENSITIVE: result = _IsOn( SW_CASE_SENSITIVE ); break; case SSL_SIDE_EFFECT: result = _IsOn( SW_SIDE_EFFECT ); break; case SSL_32_BIT: GetMADTypeDefault( MTK_INTEGER, &mti ); result = (mti.b.bits >= 32); break; } break; case 23: // nyi - end temp MarkArrayOrder( parm ); break; case 24: StartSubscript(); break; case 25: AddSubscript(); break; case 26: EndSubscript(); break; } return( result ); }
void ProcCall( void ) { mad_string ctype; int parm; const char *results; address start; const char *old; location_list ll; dig_type_info ti; dig_type_info *pti; char *p; const mad_reg_info **parm_reg; if( CurrToken == T_DIV ) { Scan(); ctype = ScanCall(); if( ctype == MAD_MSTR_NIL ) { Error( ERR_LOC, LIT_ENG( ERR_BAD_CALL_TYPE ) ); } } else { ctype = DefCallType; } CallExpr( &start ); if( _IsOff( SW_HAVE_SET_CALL ) ) { FiniCall(); p = TxtBuff; *p++ = '('; parm_reg = MADCallParmRegList( ctype, start ); for( parm = 0; parm_reg[parm] != NULL; ++parm ) { if( parm > 0 ) { *p++ = ','; } p = StrCopy( parm_reg[parm]->name, p ); } *p++ = ')'; StrCopy( MADCallReturnReg( ctype, start )->name, p ); old = ReScan( TxtBuff ); DoCallSet(); ReScan( old ); } parm = 0; results = DefReturn; if( CurrToken == T_LEFT_PAREN ) { Scan(); if( CurrToken != T_RIGHT_PAREN ) { for( ; ; ) { pti = &ti; if( CurrToken == T_DIV ) { Scan(); if( CurrToken == T_DIV ) { Scan(); /* on stack */ LocationCreate( &ll, LT_INTERNAL, NULL ); pti = NULL; } else { GetLocation( &ll, pti ); } } else { if( DefParms[parm] == NULL ) { /* on stack */ LocationCreate( &ll, LT_INTERNAL, NULL ); pti = NULL; } else { old = ReScan( DefParms[parm] ); GetLocation( &ll, pti ); ReScan( old ); } } PushLocation( &ll, pti ); NormalExpr(); SwapStack( 1 ); ++parm; if( CurrToken != T_COMMA ) break; Scan(); } } Recog( T_RIGHT_PAREN ); results = ScanPos(); if( CurrToken == T_DIV ) { Scan(); } else if( ScanEOC() ) { results = DefReturn; } else { /* syntax check */ ChkPrintList(); } } ReqEOC(); FreezeRegs(); if( PerformExplicitCall( start, ctype, parm ) && results != NULL ) { old = ReScan( results ); if( Spawn( CallResults ) == 0 ) { ReScan( old ); } } UnFreezeRegs(); FreePgmStack( false ); }