void ProcFlip( void ) { const char *old; uint_16 wait; wait = 0; if( !ScanEOC() ) { old = ScanPos(); switch( ScanCmd( "ON\0OFf\0" ) ) { case 0: ReqEOC(); _SwitchOn( SW_FLIP ); return; case 1: ReqEOC(); _SwitchOff( SW_FLIP ); return; default: ReScan( old ); wait = (uint_16)ReqExpr(); ReqEOC(); break; } } Flip( wait ); }
void ProcFlip( void ) { char *old; unsigned wait; unsigned cmd; wait = 0; if( !ScanEOC() ) { old = ScanPos(); cmd = ScanCmd( OnOffNameTab ); switch( cmd ) { case 1: ReqEOC(); _SwitchOn( SW_FLIP ); return; case 2: ReqEOC(); _SwitchOff( SW_FLIP ); return; default: ReScan( old ); wait = ReqExpr(); ReqEOC(); break; } } Flip( wait ); }
void ProcACmd( void ) { int cmd; ChkBreak(); CmdStart = ScanPos(); switch( CurrToken ) { case T_CMD_SEPARATOR: Scan(); break; case T_DIV: Scan(); ProcDo(); break; case T_LT: Scan(); ProcInvoke(); break; case T_GT: Scan(); ProcLog(); break; case T_QUESTION: Scan(); ProcPrint(); break; case T_MUL: Scan(); ProcRemark(); break; case T_EXCLAMATION: Scan(); ProcSystem(); break; case T_TILDE: Scan(); ProcThread(); break; default: cmd = ScanCmd( CmdNameTab ); if( cmd < 0 ) { if( _IsOn( SW_IMPLICIT ) ) { ProcInvoke(); } else { ProcNil(); } } else { (*CmdJmpTab[ cmd ])(); } break; } ScanSavePtr = 0; /* clean up previous ScanSave locations */ }
void ProcAssign( void ) { char *startpos; if( !AdvMachState( ACTION_ASSIGNMENT ) ) { FlushEOC(); return; } startpos = ScanPos(); NormalExpr(); PopEntry(); ReqEOC(); RecordCommand( startpos, CMD_ASSIGN ); }
void ProcModify( void ) { const char *startpos; mad_type_handle mth; mad_type_kind tk; if( !AdvMachState( ACTION_MODIFY_MEMORY ) ) { FlushEOC(); return; } startpos = ScanPos(); if( CurrToken != T_DIV ) { MemMod( GetMADTypeHandleDefaultAt( NilAddr, MTK_BASIC ), MAS_MEMORY ); } else { Scan(); mth = ScanType( MAS_ALL | MTK_ALL, &tk ); if( mth == MAD_NIL_TYPE_HANDLE ) { Error( ERR_LOC, LIT_ENG( ERR_BAD_OPTION ), GetCmdName( CMD_MODIFY ) ); } MemMod( mth, tk ); } RecordCommand( startpos, CMD_MODIFY ); }
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 ); }
static unsigned MechGet( unsigned select, unsigned parm ) { unsigned result; DIPHDL( cue, ch ); sym_list *sym; address addr; unsigned old; char *save_scan; char *mod_name; unsigned mod_len; unsigned mod_spec_token; result = FALSE; switch( select ) { case 0: /* init */ memset( &CurrGet, 0, sizeof( CurrGet ) ); CurrGet.li.mod = NO_MOD; if( _IsOn( SW_CASE_SENSITIVE ) ) { CurrGet.li.case_sensitive = TRUE; } else { CurrGet.li.case_sensitive = FALSE; } break; case 1: /* fini */ switch( CurrGet.kind ) { case GET_NAME: PushName( &CurrGet.li ); break; case GET_OPERATOR: CurrGet.li.type = ST_OPERATOR; PushName( &CurrGet.li ); break; case GET_LNUM: switch( FindACue( ch ) ) { case SR_EXACT: break; case SR_CLOSEST: if( ClosestLineOk ) break; default: Error( ERR_NONE, LIT( ERR_NO_CODE ), CurrGet.li.name.len ); } PushAddr( CueAddr( ch ) ); break; } break; case 2: /* mod curr */ case 3: /* mod name lookup */ //NYI: temporary gunk CurrGet.multi_module = TRUE; CurrGet.li.mod = NO_MOD; save_scan = ScanPos(); ReScan( "@" ); mod_spec_token = CurrToken; ReScan( save_scan ); if( CurrToken == T_NAME ) { mod_name = NamePos(); mod_len = NameLen(); Scan(); } else { mod_name = NULL; mod_len = 0; } if( CurrToken == mod_spec_token ) { if( select == 2 ) { CurrGet.li.mod = ImagePrimary()->dip_handle; if( CurrGet.li.mod == NO_MOD ) { CurrGet.li.mod = ILL_MOD; /* cause lookup to fail */ } } else { CurrGet.li.mod = LookupImageName( CurrGet.li.name.start, CurrGet.li.name.len ); if( CurrGet.li.mod == NO_MOD ) { #define ANY_IMAGE_NAME "_anyimage" #define ANY_IMAGE_NAME_LEN (sizeof(ANY_IMAGE_NAME)-1) if( CurrGet.li.name.len != ANY_IMAGE_NAME_LEN || memicmp( CurrGet.li.name.start, ANY_IMAGE_NAME, ANY_IMAGE_NAME_LEN ) != 0 ) { Error( ERR_NONE, LIT( ERR_NO_IMAGE ), CurrGet.li.name.start, CurrGet.li.name.len ); } else { CurrGet.any_image = TRUE; } } } CurrGet.li.name.start = mod_name; CurrGet.li.name.len = mod_len; Scan(); } else { ReScan( save_scan ); } if( CurrGet.li.name.start != NULL ) { CurrGet.li.mod = LookupModName( CurrGet.li.mod, CurrGet.li.name.start, CurrGet.li.name.len ); if( CurrGet.li.mod == NO_MOD ) { Error( ERR_NONE, LIT( ERR_NO_MODULE ), CurrGet.li.name.start, CurrGet.li.name.len ); } CurrGet.multi_module = FALSE; } else if( !CurrGet.any_image && CurrGet.li.mod == NO_MOD ) { CurrGet.li.mod = CodeAddrMod; CurrGet.multi_module = FALSE; } break; case 4: /* file scope */ CurrGet.li.file_scope = TRUE; break; case 5: /* given scope */ CurrGet.li.file_scope = FALSE; break; case 6: /* scope lookup */ CurrGet.li.scope.start = CurrGet.li.name.start; CurrGet.li.scope.len = CurrGet.li.name.len; break; case 7: /* get name >>bool */ if( CurrToken == T_NAME ) { CurrGet.kind = GET_NAME; CurrGet.li.name.start = NamePos(); CurrGet.li.name.len = NameLen(); Scan(); result = TRUE; } break; case 8: /* get operator name */ CurrGet.kind = GET_OPERATOR; CurrGet.li.name.start = NamePos(); CurrGet.li.name.len = NameLen(); Scan(); break; case 9: /* get line number >>bool */ if( CurrToken == T_LEFT_BRACE ) { size_t len; /* Get a specfic file name for the module */ ScanQuote( &CurrGet.li.source.start, &len ); CurrGet.li.source.len = len; } if( CurrToken == T_INT_NUM ) { unsigned_64 tmp; result = TRUE; CurrGet.kind = GET_LNUM; old = SetCurrRadix( 10 ); tmp = IntNumVal(); CurrGet.li.name.len = U32FetchTrunc( tmp ); Scan(); SetCurrRadix( old ); } break; case 10: /* GetDtorName >>bool */ if( CurrToken == T_NAME ) { CurrGet.kind = GET_NAME; CurrGet.li.name.start = NamePos(); CurrGet.li.name.len = NameLen(); CurrGet.li.type = ST_DESTRUCTOR; addr = Context.execution; sym = LookupSymList( SS_SCOPED, &addr, FALSE, &CurrGet.li ); if( sym != NULL ) { PurgeSymHandles(); Scan(); result = TRUE; } else { CurrGet.li.type = ST_NONE; } } break; case 11: /* GetSetNameType(symbol_type) */ CurrGet.li.type = parm; break; case 12: /* GetQueryName >>bool */ CurrGet.kind = GET_NAME; addr = Context.execution; sym = LookupSymList( SS_SCOPED, &addr, FALSE, &CurrGet.li ); if( sym != NULL ) { PurgeSymHandles(); result = TRUE; } else { CurrGet.li.type = ST_NONE; } break; case 13: /* GetAddScope */ if( CurrGet.li.scope.len == 0 ) { CurrGet.li.scope = CurrGet.li.name; } else { CurrGet.li.scope.len = (CurrGet.li.name.start-CurrGet.li.scope.start) + CurrGet.li.name.len; } break; } return( result ); }
void Spectrometer::currentScanPosition(qreal position) { emit ScanPos(position); }
void Error( dbg_err_flags flg, char *fmt, ... ) { char buff[TXT_LEN]; va_list args; char *ptr; invokes *inv; input_stack *inp; char *where; bool cmderror; va_start( args, fmt ); ptr = buff; if( flg & ERR_INTERNAL ) { ptr = StrCopy( LIT_ENG( Internal_Error ), ptr ); } ptr = FmtStr( ptr, fmt, args ); ptr = StrCopy( ".", ptr ); if( flg & ERR_LOC ) { ptr = StrCopy( "\n ", ptr ); switch( CurrToken ) { case T_CMD_SEPARATOR: ptr = StrCopy( LIT_ENG( ERR_NEAR_END_OF_COMMAND ), ptr ); break; case T_LINE_SEPARATOR: ptr = StrCopy( LIT_ENG( ERR_NEAR_END_OF_LINE ), ptr ); break; default: if( ScanLen() == 0 ) Scan(); ptr = Format( ptr, LIT_ENG( ERR_NEAR_TOKEN ), ScanPos(), ScanLen() ); break; } } SetProgStartHook( TRUE ); UnFreezeRegs(); ScanExpr( NULL ); ExprPurge(); PurgeSymHandles(); /* must be done after ExprPurge */ DIPCancel(); ScanSavePtr = 0; /* clean up previous ScanSave locations */ if( _IsOff( SW_ERROR_PRESERVES_RADIX ) ) { RestoreRadix(); } _SwitchOff( SW_CALL_FATAL ); if( _IsOn( SW_ERROR_STARTUP ) ) { StartupErr( buff ); } if( _IsOn( SW_ERR_IN_TXTBUFF ) ) { PurgeInpStack(); StrCopy( buff, TxtBuff ); DUIArrowCursor(); Suicide(); } if( (flg & ERR_SILENT) == 0 ) { where = LIT_ENG( ERR_EXECUTING_AT ); for( inp = InpStack; inp != NULL; inp = inp->link ) { if( inp->type & INP_CMD_FILE ) { inv = inp->handle; ptr = StrCopy( "\n ", ptr ); ptr = Format( ptr, where, inv->line, inv->name ); where = LIT_ENG( ERR_CALLED_FROM ); } } DUIFlushKeys(); DUIWndDebug(); RingBell(); DUIErrorBox( buff ); } cmderror = FALSE; for( inp = InpStack; inp != NULL; inp = inp->link ) { if( inp->type & INP_BREAK_POINT ) { BrkCmdError(); } if( inp->type & INP_CAPTURED ) { CaptureError(); } if( inp->type & INP_DLG_CMD ) { cmderror = TRUE; } } PurgeInpStack(); if( cmderror && fmt != LIT_ENG( ERR_DBG_INTERRUPT ) ) { DlgCmd(); ProcInput(); } if( _IsOn( SW_ERROR_RETURNS ) ) return; DUIArrowCursor(); Suicide(); }
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 ); }
static void DoCallSet( void ) { mad_string ctype; int parm; int i; const char *start; struct { union { const char *arg; char *start; } u; unsigned len; } new_parms[MAX_PARMS]; location_list ll; dig_type_info ti; if( CurrToken == T_DIV ) { Scan(); ctype = ScanCall(); if( ctype == MAD_MSTR_NIL ) { Error( ERR_LOC, LIT_ENG( ERR_BAD_CALL_TYPE ) ); } } else { ctype = DefCallType; } if( CurrToken == T_LEFT_PAREN ) { parm = 0; Scan(); if( CurrToken != T_RIGHT_PAREN ) { for( ;; ) { if( parm >= MAX_PARMS ) Error( ERR_LOC, LIT_ENG( ERR_TOO_MANY_PARMS ) ); new_parms[parm].u.arg = ScanPos(); GetLocation( &ll, &ti ); new_parms[parm].len = ScanPos() - new_parms[parm].u.arg; ++parm; if( CurrToken != T_COMMA ) break; Scan(); } } Recog( T_RIGHT_PAREN ); } else { parm = -1; } start = ScanPos(); if( CurrToken == T_DIV ) { Scan(); } else if( ScanEOC() ) { start = NULL; } else { /* syntax check */ ChkPrintList(); } ReqEOC(); if( start != NULL ) { char *new_return; i = ScanPos() - start; new_return = DbgMustAlloc( i + 1 ); memcpy( new_return, start, i ); new_return[i] = NULLCHAR; _Free( DefReturn ); DefReturn = new_return; } if( parm >= 0 ) { for( i = 0; i < parm; ++i ) { char *new_arg; _Alloc( new_arg, new_parms[i].len + 1 ); if( new_arg == NULL ) { parm = i; for( i = 0; i < parm; ++i ) { _Free( new_parms[i].u.start ); } parm = 0; Error( ERR_NONE, LIT_ENG( ERR_NO_MEMORY_FOR_EXPR ) ); break; } else { memcpy( new_arg, new_parms[i].u.arg, new_parms[i].len ); new_arg[new_parms[i].len] = NULLCHAR; new_parms[i].u.start = new_arg; } } FreeParms(); for( i = 0; i < parm; ++i ) { DefParms[i] = new_parms[i].u.start; } } DefCallType = ctype; }
OVL_EXTERN void ProcNil( void ) { if( ScanLen() == 0 ) Scan(); Error( ERR_NONE, LIT_ENG( ERR_BAD_COMMAND ), ScanPos(), ScanLen() ); }