diff --git a/src/plugins/shell-functions.cpp b/src/plugins/shell-functions.cpp new file mode 100644 index 0000000000000000000000000000000000000000..069d0024b1aa3d1720d1c4fe46719050bbd26c20 --- /dev/null +++ b/src/plugins/shell-functions.cpp @@ -0,0 +1,517 @@ +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * Copyright Projet JRL-Japan, 2007 + *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * File: shell-functions.cpp + * Project: DYNAMIC-GRAPH + * Author: François Bleibel, Nicolas Mansard + * + * Version control + * =============== + * + * $Id$ + * + * Description + * ============ + * + * + * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + +#include <dynamic-graph/shell-functions.h> +#include <dynamic-graph/plugin-loader.h> +#include <dynamic-graph/factory.h> +#include <dynamic-graph/debug.h> +#include <dynamic-graph/entity.h> +#include <dynamic-graph/signal.h> +#include <dynamic-graph/exception-signal.h> + +#ifdef WIN32 +#include <Windows.h> +#endif + +#include <fstream> +using namespace std; +using namespace dynamicgraph; + +void ShellFunctions:: +cmdTry( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - try <cmd...>" + << "\t\t\t\tTry <cmd> and display the caught exception." <<endl; + return; + } + string cmdLine2; + cmdArg>>cmdLine2; + dgDEBUG(5)<<"Try <" <<cmdLine2<<">"<<endl; + try{ + g_shell.cmd(cmdLine2,cmdArg,os); + } catch ( const ExceptionAbstract& e ) { os << "dgERROR catch: " <<endl<< e<<endl; } + catch( ... ) { os<<"Unknown error catch." <<endl; } + +} +void ShellFunctions:: +cmdLoadPlugins( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - loadPlugins <file.txt> <directory>" + << "\t\tLoad the plugins listed in the file." <<endl; + return; + } + if( NULL!=g_shell.dlPtr ) + { + string pluginName,directory; + cmdArg >> pluginName; + cmdArg >> directory; + dgDEBUG(15) << "Load plugin list <" <<pluginName<<"> from dir <" << directory<<">."<<endl; + if( directory.length() != 0 ) g_shell.dlPtr->setDirectory( directory ); + g_shell.dlPtr ->loadPluginList( pluginName ); + g_shell.dlPtr->loadPlugins(); + } + else { os << "!! Dynamic loading functionalities not accessible through the shell." <<endl; } +} +void ShellFunctions:: +cmdClearPlugin( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - clearPlugin <className>" + << "\t\tDestroy all the objects of type <className>." <<endl; + return; + } + + string pluginName; + cmdArg >> pluginName; + g_pool.clearPlugin( pluginName ); + +} + +void ShellFunctions:: +cmdDisplayPlugins( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - displayPlugins " + << "\t\t\t\tDisplay the name of the loaded plugins." <<endl; + return; + } + if( NULL!=g_shell.dlPtr ) + { + std::map< std::string,std::string > m = g_shell.dlPtr->getLoadedPluginNames(); + for( std::map< std::string,std::string >::const_iterator iter = m.begin(); + iter!=m.end(); ++iter ) + { + os << " - <"<<iter->first<<">:\t"<<iter->second<<endl; + } + + } + else { os << "!! Dynamic loading functionalities not accessible through the shell." <<endl; } + + +} + + + +void ShellFunctions:: +cmdDisplayFactory( const std::string cmdLine, std::istringstream& cmdArg, + std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - "; g_factory.commandLine(cmdLine,cmdArg,os); + return; + } + + string cmd2; cmdArg >> cmd2; + g_factory.commandLine( cmd2,cmdArg,os ); +} + +void ShellFunctions:: +cmdCommentary( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { os << " # comment with '#': ignore the end of the line." <<endl; } + return; +} + + +void ShellFunctions:: +cmdUnplug( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - unplug <obj2.sig2>" + << "\t\t\t\tPlug on sig2 (consumer) in sig1->sig2." <<endl; + return; + } + string ssig; + cmdArg>>ssig; + + string obj2,fun2; + istringstream str2(ssig); + if( !Interpreter::objectNameParser(str2,obj2,fun2) ) + { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "Plug function: syntax is unplug OBJ2.SIG2.", + "(while calling plug %s %s).",ssig.c_str() ); + } + + dgDEBUG(20) << "Get Ent2 <"<<obj2<<"> ."<<endl; + Entity& ent2 = g_pool.getEntity(obj2); + dgDEBUG(20) << "Get Sig2 <"<<fun2<<"> ."<<endl; + SignalBase<int> &sig2 = ent2.getSignal(fun2); + + + dgDEBUG(25) << "Unplug..."<<endl; + sig2.unplug(); +} + +void ShellFunctions:: +cmdSignalTime( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - signalTime <obj.sig>" + << "\t\t\t\tDisplay the time of sig." <<endl; + return; + } + + string ssig; + cmdArg>>ssig; + + string obj2,fun2; + istringstream str2(ssig); + if( !Interpreter::objectNameParser(str2,obj2,fun2) ) + { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "Plug function: syntax is unplug OBJ2.SIG2.", + "(while calling plug %s %s).",ssig.c_str() ); + } + + dgDEBUG(20) << "Get Ent2 <"<<obj2<<"> ."<<endl; + Entity& ent2 = g_pool.getEntity(obj2); + dgDEBUG(20) << "Get Sig2 <"<<fun2<<"> ."<<endl; + SignalBase<int> &sig2 = ent2.getSignal(fun2); + + os << sig2.getTime() << endl; +} + +void ShellFunctions:: +cmdSynchroSignal( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - synchro <obj.sig> [<period>]" + << "\t\t\t\tGet/Set the syncho of a signal <sig>." <<endl; + return; + } + + SignalBase<int> & sig = g_pool.getSignal( cmdArg ); + cmdArg >>ws; + if( cmdArg.good() ) + { + int period; cmdArg>>period; + sig.setPeriodTime( period ); + cmdArg >>ws; + if( cmdArg.good() ) + { + /* The sig is recomputed at the given period from the + * current time, at any time T so that T%p==0, p the period. + * By modifying the current time, the sig reomputation is done + * at T s.t. T%p=d, d the desynchro. */ + int currTime = sig.getTime (); + int desynchro; cmdArg>>desynchro; + sig.setTime( currTime+desynchro ); + } + } + else + { + os << "period = " << sig.getPeriodTime() << std::endl; + } +} + +void ShellFunctions:: +cmdEcho( const std::string cmdLine, std::istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - echo <string>" + << "\t\t\t\tPrint <string. on the standard output." <<endl; + return; + } + + cmdArg >>ws; + while( cmdArg.good() ) + { + std::string toPrint; cmdArg>>toPrint; + os<<toPrint<<" "; + } + os<<std::endl; +} + +void ShellFunctions:: +cmdCopy( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - copy <obj1.sig1> <obj2.sig2>" + << "\t\tCopy the value of sig1 to constant value in sig2." <<endl; + return; + } + string ssig1,ssig2; + cmdArg>>ssig1>>ssig2; + istringstream str1(ssig1),str2(ssig2); + + try { + SignalBase<int> &sig1 = g_pool.getSignal( str1 ); + SignalBase<int> &sig2 = g_pool.getSignal( str2 ); + + dgDEBUG(25) << "Copy..."<<endl; + sig2.plug(&sig1); + sig2.setConstantDefault(); + sig2.plug(&sig2); + } catch( ExceptionAbstract & err ) { throw; } + catch( ... ) { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "Copy: syntax is copy OBJ1.SIG1 OBJ2.SIG2.", + "(while calling copy %s %s).",ssig1.c_str(), + ssig2.c_str() ); + } + +} + +void ShellFunctions:: +cmdFreeze( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - freeze <obj.sig> " + << "\t\tOn a ptr-sig: save the current value from the source " + << "and unplug the signal." <<endl; + return; + } + string ssig1; + cmdArg>>ssig1; + istringstream str1(ssig1); + + try { + SignalBase<int> &sig1 = g_pool.getSignal( str1 ); + + dgDEBUG(25) << "Unplug..."<<endl; + sig1.setConstantDefault(); + sig1.plug(&sig1); + } catch( ... ) { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "Freeze: syntax is freeze OBJ.SIG.", + "(while calling freeze %s ).",ssig1.c_str()); + } + +} + +void ShellFunctions:: +cmdSqueeze( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - squeeze <mainObj.mainSig> <squeezeObj.sigIn> <squeezeObj.sigOut>" + << "\t\tIntercalate squeezeObj between mainObj and its source." <<endl; + return; + } + + string ssigMain,ssigIn,ssigOut; + cmdArg>>ssigMain>>ssigIn>>ssigOut; + istringstream strMain(ssigMain); + istringstream strIn(ssigIn); + istringstream strOut(ssigOut); + + try { + SignalBase<int> &sigMain = g_pool.getSignal(strMain ); + SignalBase<int> &sigIn = g_pool.getSignal( strIn ); + SignalBase<int> &sigOut = g_pool.getSignal( strOut ); + + SignalBase<int> *sigMainSource = sigMain.getPluged(); + if( sigMainSource==&sigMain ) + { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "The main signal is autopluged (or set constant). ", + "(while calling freeze %s ).",ssigMain.c_str()); + } + + sigMain.plug( &sigOut ); + sigIn.plug( sigMainSource ); + } + catch( ExceptionFactory& exc ) { + switch( exc.getCode() ) + { + case ExceptionFactory::UNREFERED_SIGNAL: + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "Sqeeze: unknown signal. ", + "(error while searching signal: %s ).", + exc.getMessage() ); + break; + default: + throw; + } + } + +} + + +void ShellFunctions:: +cmdEnableTrace( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - debugtrace [{true|false}] [<filename>=" + << DebugTrace::DEBUG_FILENAME_DEFAULT <<"]" + << "\t\tOpen/close the file <filename> for debug tracing." <<endl; + return; + } + string opt,filename; + + cmdArg >> ws; + if( cmdArg.good() ) + { + cmdArg>>opt>>ws; + if( opt=="true" ) + if( cmdArg.good() ) + { + cmdArg>>filename; + DebugTrace::openFile( filename.c_str() ); + } + else { DebugTrace::openFile(); } + else DebugTrace::closeFile(); + } + else + { + if( dgDEBUGFLOW.outputbuffer.good() ) os << "true" <<endl; + else os << "false" <<endl; + } + +} + +void ShellFunctions:: +cmdSetPrompt( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - prompt [<string>] " + << "\t\tSet/get the default prompt." <<endl; + return; + } + + string opt; + cmdArg >> ws; + if( cmdArg. good() ) + { + char buffer [80]; cmdArg .getline(buffer,80); + g_shell .prompt = buffer; + } else { os << "Current prompt is <" << g_shell. prompt << ">." << endl; } +} + +void ShellFunctions:: +cmdSleep( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - sleep [<float> secs] " + << "\t\tSleep (time in secs)." <<endl; + return; + } + + string opt; + cmdArg >> ws; + if( cmdArg. good() ) + { + double secs; cmdArg >> secs; + if( secs > 0 ) +#ifndef WIN32 + usleep( int(secs*1000000) ); +#else + Sleep( int(secs*1000) ); +#endif + } else { /* TODO ERROR */ } +} + +void ShellFunctions:: +cmdBeep( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - beep [<float> secs] " + << "\t\tSend a bip to the std::cout." <<endl; + return; + } + + os << char(7) << "Beep!" << std::endl; +} + +void ShellFunctions:: +cmdCompletionList( const std::string cmdLine, istringstream& cmdArg, std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - completion <filename>" + << "\t\tGenerate the completion list for current graph." <<endl; + return; + } + + try { + + std::string aFileName; cmdArg >> aFileName; + std::ofstream completionFile((char *)aFileName.c_str()); + g_pool.writeCompletionList( completionFile ); + + + } catch( ExceptionAbstract & err ) { throw; } + catch( ... ) { + DG_THROW ExceptionFactory( ExceptionFactory::SYNTAX_ERROR, + "setflag: sig should be of flag type. ", + "(while calling setflag)."); + } + +} + + +extern "C" { + ShellFunctionRegisterer regFun1 + ( "try",boost::bind(ShellFunctions::cmdTry,_1,_2,_3) ); + ShellFunctionRegisterer regFun2 + ( "loadPlugins",boost::bind(ShellFunctions::cmdLoadPlugins,_1,_2,_3) ); + ShellFunctionRegisterer regFun3 + ( "displayPlugins",boost::bind(ShellFunctions::cmdDisplayPlugins,_1,_2,_3) ); + ShellFunctionRegisterer regFun4 + ( "factory",boost::bind(ShellFunctions::cmdDisplayFactory,_1,_2,_3) ); + ShellFunctionRegisterer regFun5 + ( "#",boost::bind(ShellFunctions::cmdCommentary,_1,_2,_3) ); + ShellFunctionRegisterer regFun7 + ( "unplug",boost::bind(ShellFunctions::cmdUnplug,_1,_2,_3) ); + ShellFunctionRegisterer regFun8 + ( "clearPlugin",boost::bind(ShellFunctions::cmdClearPlugin,_1,_2,_3) ); + ShellFunctionRegisterer regFun9 + ( "signalTime",boost::bind(ShellFunctions::cmdSignalTime,_1,_2,_3) ); + ShellFunctionRegisterer regFun10 + ( "synchro",boost::bind(ShellFunctions::cmdSynchroSignal,_1,_2,_3) ); + ShellFunctionRegisterer regFun11 + ( "echo",boost::bind(ShellFunctions::cmdEcho,_1,_2,_3) ); + ShellFunctionRegisterer regFun12 + ( "copy",boost::bind(ShellFunctions::cmdCopy,_1,_2,_3) ); + ShellFunctionRegisterer regFun13 + ( "freeze",boost::bind(ShellFunctions::cmdFreeze,_1,_2,_3) ); + ShellFunctionRegisterer regFun13b + ( "squeeze",boost::bind(ShellFunctions::cmdSqueeze,_1,_2,_3) ); + ShellFunctionRegisterer regFun14 + ( "debugtrace",boost::bind(ShellFunctions::cmdEnableTrace,_1,_2,_3) ); + ShellFunctionRegisterer regFun15 + ( "prompt",boost::bind(ShellFunctions::cmdSetPrompt,_1,_2,_3) ); + ShellFunctionRegisterer regFun16 + ( "sleep",boost::bind(ShellFunctions::cmdSleep,_1,_2,_3) ); + ShellFunctionRegisterer regFun17 + ( "beep",boost::bind(ShellFunctions::cmdBeep,_1,_2,_3) ); + ShellFunctionRegisterer regFun19 + ( "completion",boost::bind(ShellFunctions::cmdCompletionList,_1,_2,_3) ); + +} + diff --git a/src/plugins/shell-procedure.cpp b/src/plugins/shell-procedure.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3a3a6f344dacf419c4b22ad4ea039fefe01ee642 --- /dev/null +++ b/src/plugins/shell-procedure.cpp @@ -0,0 +1,278 @@ +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * Copyright Projet JRL-Japan, 2007 + *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * + * File: shell-procedure.cpp + * Project: DYNAMIC-GRAPH + * Author: François Bleibel, Nicolas Mansard + * + * Version control + * =============== + * + * $Id$ + * + * Description + * ============ + * + * + * ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + +#include <dynamic-graph/shell-procedure.h> +#include <dynamic-graph/plugin-loader.h> +#include <dynamic-graph/factory.h> +#include <dynamic-graph/debug.h> +#include <dynamic-graph/entity.h> + +#include <fstream> +using namespace std; +using namespace dynamicgraph; + +void ShellProcedure:: +cmdStartProcedure( const std::string& cmdLine,std::istringstream& args,std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - proc <name>" + << "\t\t\t\tProcedure header." <<endl; + return; + } + + args>>procName; + dgDEBUG(5)<<"Proc <" <<procName<<">"<<endl; + + currentProc.clear(); + args >> ws; + while( args.good() ) + { + std::string next; + args>>next>>ws; + currentProc.params.push_back(next); + } +} + +void ShellProcedure:: +cmdContinueProcedure( const std::string& cmdLine,std::istringstream& args,std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - -> cmd args..." + << "\t\t\t\tProcedure body." <<endl; + return; + } + + std::string cmd2; + args>>ws>>cmd2; + dgDEBUG(5)<<"Proc <" <<procName<<">: "<<cmd2<<endl; + + Instruction ins; ins.cmd=cmd2; + args >> ws; + while( args.good() ) + { + std::string next; int param=-1; + args>>next>>ws; + for( unsigned int i=0;i<currentProc.params.size();++i ) + { if( next==currentProc.params[i] ) { param=i; break; } } + ins.args.push_back(next); + ins.params.push_back( param ); + } + + currentProc.instructions.push_back( ins ); +} + +void ShellProcedure:: +cmdEndProcedure( const std::string& cmdLine,std::istringstream& args,std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - endproc..." + << "\t\t\t\tProcedure end." <<endl; + return; + } + + dgDEBUG(5)<<"Proc <" <<procName<<">: endproc"<<endl; + procedureList[ procName ] = currentProc; + +// std::string toto="toto"; +// for( Procedure::iterator ins=procedureList[ toto ].begin(); +// ins!=procedureList[ toto ].end(); ++ins ) +// { +// dgDEBUG(15) << "Proc <" << procName << "> : " +// << ins->cmd << " -> " << ins->args <<endl; +// } + + currentProc.clear(); + + if( g_shell.deregisterFunction( procName )) + { os<< "Redefining proc <"<<procName<<">: procedure already defined. " + << "Overwrite it."<<endl; } + ShellFunctionRegisterer registration + ( procName.c_str(),boost::bind(&ShellProcedure::cmdProcedure, + this,procName,_1,_2,_3) ); + +} + +void ShellProcedure:: +cmdProcedure( const std::string& procname, + const std::string& cmdLine,std::istringstream& args,std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os<<" - "<<procname<<"\t\t\t\t\tUser-defined procedure"<<endl; + args >> ws; + if( args.good() ) + { + std::string argname; + const unsigned int gc = args.tellg(); + args >> argname; + args.seekg(gc); args.clear(); + if( procname==argname ) + { + /* if cmdline = "Help <procname>", then display + * the proc instruction. */ + ProcedureList::iterator pair = procedureList.find( argname ); + if( pair==procedureList.end() ) + { + DG_THROW ExceptionFactory( ExceptionFactory::UNREFERED_FUNCTION, + "Undefined procedure", + ": procedure <%s> not defined.", + argname.c_str() ); + } + + Procedure & proc = pair->second; + unsigned int cmdnum=1; + for( std::list<Instruction>::iterator ins=proc.instructions.begin(); + ins!=proc.instructions.end(); ++ins ) + { + os<<"\t#" <<cmdnum++<<" "<<ins->cmd; // <<" "<<ins->args <<endl; + for( unsigned int i=0;i<ins->args.size();++i ) + { os << " " << ins->args[i]; } + os << endl; + } + + } + } + return; + } + + + dgDEBUG(15) << " Calling procedure <" <<cmdLine<<"> " <<endl; + ProcedureList::iterator pair = procedureList.find( cmdLine ); + if( pair==procedureList.end() ) + { + DG_THROW ExceptionFactory( ExceptionFactory::UNREFERED_FUNCTION, + "Undefined procedure", + ": procedure <%s> not defined.",cmdLine.c_str() ); + } + + /* You need a copy here, in case the proc is removed from the + * list by itself: + * % proc next + * % -> proc next + * % -> -> echo TOTO + * % -> endproc + * % endproc + */ + Procedure proc = pair->second; + + std::vector< std::string > paramValue; + for( unsigned int i=0;i<proc.params.size();++i ) + { + args>>ws; + if( args.good() ) + { + std::string next; args>>next>>ws; + paramValue.push_back( next ); + dgDEBUG(25) << "Args : <" << next << ">"<<endl; + } + else { paramValue.push_back(""); } + } + + istringstream iss; ostringstream oss; + for( std::list<Instruction>::iterator ins=proc.instructions.begin(); + ins!=proc.instructions.end(); ++ins ) + { + dgDEBUG(15) << "Proc <" << cmdLine << "> : " << ins->cmd << endl; + oss.clear(); oss.str(""); + for( unsigned int i=0;i<ins->params.size();++i ) + { + int paramArg = ins->params[i]; + if( paramArg==-1 ) oss << ins->args[i] << " "; + else oss << paramValue[paramArg] << " "; + } + + dgDEBUG(15) << " Args = " << oss.str() << endl; + iss.str(oss.str()); iss.clear(); + g_shell.cmd(ins->cmd,iss,os); + } +} + +void ShellProcedure:: +cmdFor( const std::string& cmdLine,std::istringstream& args,std::ostream& os ) +{ + if( cmdLine == "help" ) + { + os << " - for 1 5 instruction "<<endl; + return; + } + + std::string cmd2,idx; + int istart,iend; + + { + stringstream oss; + + args >> cmd2; oss.str( cmd2 ); + const unsigned int SIZE = 32; char b1[SIZE],b2[SIZE],b3[SIZE]; + oss.getline( b1,SIZE,'=' ); + oss.getline( b2,SIZE,':' ); + oss.getline( b3,SIZE ); + dgDEBUG(15) << b1 << "/" << b2 << "/" << b3 << endl; + + idx = b1; istart = atoi(b2); iend = atoi(b3); + args >> cmd2; + + dgDEBUG(15) << "FOR <" << idx << "> = " << istart << " TO " << iend + << " DO " << cmd2 <<endl; + } + + string argsstr; + { + const unsigned int SIZE = 1024; char buffer[SIZE]; + args.getline( buffer,SIZE ); + argsstr = buffer; + } + for( int i=istart;i<=iend;++i ) + { + istringstream iss; stringstream oss; + + std::string insp; + istringstream issargs( argsstr ); + while( issargs.good() ) + { + issargs >> insp; + if( insp == idx ) { oss << i << " "; } else { oss<<insp<< " "; } + } + iss.str( oss.str() ); + g_shell.cmd(cmd2,iss,os); + } +} + +ShellProcedure sotShellProceduror; + +extern "C" { + ShellFunctionRegisterer regFun1 + ( "proc",boost::bind(&ShellProcedure::cmdStartProcedure, + &sotShellProceduror,_1,_2,_3) ); + + ShellFunctionRegisterer regFun2 + ( "->",boost::bind(&ShellProcedure::cmdContinueProcedure, + &sotShellProceduror,_1,_2,_3) ); + ShellFunctionRegisterer regFun3 + ( "endproc",boost::bind(&ShellProcedure::cmdEndProcedure, + &sotShellProceduror,_1,_2,_3) ); + + ShellFunctionRegisterer regFun4 + ( "for",boost::bind(&ShellProcedure::cmdFor, + _1,_2,_3) ); +} +