//-------------------------------------- int CPROC CMD_GETPARTIAL( PSENTIENT ps, PTEXT parameters ) { if( ps->Data ) { PTEXT pSave, temp; pSave = parameters; if( ( temp = GetParam( ps, ¶meters ) ) ) { if( temp == pSave ) { DECLTEXT( msg, WIDE("Parameter to GetPartial was not a variable reference.") ); EnqueLink( &ps->Command->Output, &msg ); return FALSE; } if( GetIndirect( temp ) ) { LineRelease( GetIndirect( temp ) ); SetIndirect( temp, NULL ); } if( ps->Data->Partial ) { SetIndirect( temp, ps->Data->Partial ); ps->Data->Partial = NULL; if( ps->CurrentMacro ) ps->CurrentMacro->state.flags.bSuccess = TRUE; } } } return FALSE; }
//-------------------------------------- int CPROC PARSE( PSENTIENT ps, PTEXT parameters ) { PTEXT temp; PTEXT devname; if( ( devname = GetParam( ps, ¶meters ) ) ) { // find device to see if it's already open... // by name! // but - this causes a problem for nested scripts // which are going to have to be artificiailly inceminated // with a unique name maybe something like script_##### PDATAPATH pdp = FindOpenDevice( ps, devname ); if( pdp ) { if( !ps->CurrentMacro ) { PVARTEXT pvt; pvt = VarTextCreate(); vtprintf( pvt, WIDE("Device named %s is already open."), GetText( devname ) ); EnqueLink( &ps->Command->Output, (POINTER)VarTextGet( pvt ) ); VarTextDestroy( &pvt ); } return -1; } if( ( temp = GetParam( ps, ¶meters ) ) ) { PDATAPATH pdp; lprintf( WIDE("Opening device handle named: %s"), GetText( devname ) ); if( ( pdp = OpenDevice( &ps->Data, ps, temp, parameters ) ) ) { while( devname->flags & TF_INDIRECT ) devname = GetIndirect( devname ); pdp->pName = SegDuplicate( devname ); if( pdp->Type ) { if( ps->CurrentMacro ) { ps->CurrentMacro->state.flags.bSuccess = TRUE; } } else { DestroyDataPath( pdp ); // new one did not finish open... } } } else { DECLTEXT( msg, WIDE("Parse must specify a name (/(parse/open) <name> <device> <options...)") ); EnqueLink( &ps->Command->Output, (PTEXT)&msg ); } } return FALSE; }
void StoreMacros( FILE *pFile, PSENTIENT ps ) { { INDEX idx; PLIST pVars; PTEXT pVar, pVal; pVars = ps->Current->pVars; fprintf( pFile, WIDE("\n## Begin Variables\n") ); LIST_FORALL( pVars, idx, PTEXT, pVar ) { fprintf( pFile, WIDE("/Declare %s "), GetText( pVar ) ); pVal = BuildLine( GetIndirect( NEXTLINE( pVar ) ) ); if( pVal ) fprintf( pFile, WIDE("%s\n"), GetText( pVal ) ); else fprintf( pFile, WIDE("\n") ); } fprintf( pFile, WIDE("\n## Begin Macros\n") ); }
int GetInputData( int bWord, PSENTIENT ps, PTEXT parameters ) { if( ps->Data ) { PTEXT pSave, temp; PTEXT *pInd = NULL; pSave = parameters; lprintf( WIDE("Get data from datapath...") ); if( !( ( temp = GetParam( ps, ¶meters ) ) ) ) { lprintf( WIDE("No parameters specified to get line") ); LineRelease( ps->pLastResult ); ps->pLastResult = NULL; pInd = &ps->pLastResult; } else { if( temp == pSave ) { DECLTEXT( msg, WIDE("is not a valid variable reference.") ); EnqueLink( &ps->Command->Output, SegAppend( SegDuplicate( temp ), (PTEXT)&msg ) ); return FALSE; } if( temp->flags & TF_INDIRECT ) { LineRelease( GetIndirect( temp ) ); SetIndirect( temp, NULL ); pInd = (PTEXT*)&temp->data.size; } else { DECLTEXT( msg, WIDE("is not a valid variable reference(not indirect).") ); EnqueLink( &ps->Command->Output, SegAppend( SegDuplicate( temp ), (PTEXT)&msg ) ); return FALSE; } } if( !pInd ) { DECLTEXT( msg, WIDE("FATAL ERROR: Did not set pInd (GetLine)") ); EnqueLink( &ps->Command->Output, (PTEXT)&msg ); return FALSE; } // try grabbing an existing line - could be put there from BURST of prior... if( !ps->Data->CurrentWord ) // just got last word off line... { if( ps->Data->CurrentLine ) { LineRelease( ps->Data->CurrentLine ); ps->Data->CurrentLine = NULL; } } if( !ps->Data->CurrentLine ) { // Gather Data from input source.... // data from HT_CLIENT 'appears' asynchrous // to scripting.... if( ps->Data->Read ) ps->Data->Read( ps->Data ); // this returns a completeline... ps->Data->CurrentLine = (PTEXT)DequeLink( &ps->Data->Input ); } if( ps->Data->CurrentLine ) if( !ps->Data->CurrentWord ) ps->Data->CurrentWord = ps->Data->CurrentLine; if( ps->Data->CurrentWord ) { // indirect pointer will be null. if( bWord ) { *pInd = SegDuplicate( ps->Data->CurrentWord ); ps->Data->CurrentWord = NEXTLINE( ps->Data->CurrentWord ); } else { // duplicate to end of line... which may be whole - or // may be partial because of prior GETWORD from the line... // then release the data input line... // must duplicate the data in either case cause // it will be deleted with additional setting of the // variable... *pInd = TextDuplicate( ps->Data->CurrentWord, FALSE ); LineRelease( ps->Data->CurrentWord ); ps->Data->CurrentLine = NULL; // do NOT release this line... ps->Data->CurrentWord = NULL; // no word on line } } if( ps->CurrentMacro && *pInd ) ps->CurrentMacro->state.flags.bSuccess = TRUE; } return FALSE; }
//-------------------------------------- int CPROC COMMAND( PSENTIENT ps, PTEXT parameters ) { PTEXT temp; PTEXT devname; if( ( devname = GetParam( ps, ¶meters ) ) ) { // find device to see if it's already open... // by name! // but - this causes a problem for nested scripts // which are going to have to be artificiailly inceminated // with a unique name maybe something like script_##### PDATAPATH pdp = FindOpenDevice( ps, devname ); if( pdp ) { if( !ps->CurrentMacro ) { PVARTEXT pvt; pvt = VarTextCreate(); vtprintf( pvt, WIDE("Device named %s is already open."), GetText( devname ) ); EnqueLink( &ps->Command->Output, (POINTER)VarTextGet( pvt ) ); VarTextDestroy( &pvt ); } return -1; } if( ( temp = GetParam( ps, ¶meters ) ) ) { PDATAPATH pdp; //lprintf( WIDE("Opening device handle named: %s"), GetText( devname ) ); if( ( pdp = OpenDevice( &ps->Command, ps, temp, parameters ) ) ) { PTEXT pCommand; PDATAPATH pOldPath; while( devname->flags & TF_INDIRECT ) devname = GetIndirect( devname ); pdp->pName = SegDuplicate( devname ); if( ps->Command ) { // remove old command queue so close won't remove // ps->Command->Input = NULL; // close the command queue... // update to the new queue in the sentience // if the new one is a data source, then we // need to move old commands to new path - // otherwise they may/will get lost. if( ps->Command->flags.Data_Source && !ps->Command->flags.Dont_Relay_Prior) { pOldPath = ps->Command->pPrior; // move all commands from old queue to new queue while( ( pCommand = (PTEXT)DequeLink( &pOldPath->Input ) ) ) { EnqueLink( &ps->Command->Input, pCommand ); } while( ( pCommand = (PTEXT)DequeLink( &pOldPath->Output ) ) ) { EnqueLink( &ps->Command->Output, pCommand ); } } } if( ps->CurrentMacro ) ps->CurrentMacro->state.flags.bSuccess = TRUE; } } else { DECLTEXT( msg, WIDE("Command must specify a name (/command <name> <device> <options...)") ); EnqueLink( &ps->Command->Output, (PTEXT)&msg ); } } return FALSE; }