-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscrshell.cpp
65 lines (59 loc) · 1.66 KB
/
scrshell.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "shell.h"
static const NnString *argv_or_null( const NnVector *argv , int n )
{
static NnString empty;
if( argv != NULL && n < argv->size() ){
return (const NnString*)argv->const_at(n);
}else{
return ∅
}
}
const NnString *ScriptShell::argv(int n) const
{ return argv_or_null( &argv_ , n ); }
const NnString *BufferedShell::argv(int n) const
{ return argv_or_null( params , n ); }
void ScriptShell::shift()
{ delete argv_.shift(); }
int ScriptShell::setLabel( NnString &label )
{
LabelOnScript *los=new LabelOnScript;
fr->getpos( los->pos );
labels.put( label , los );
return 0;
}
int ScriptShell::goLabel( NnString &label )
{
LabelOnScript *los=(LabelOnScript*)labels.get(label);
if( los != NULL ){
fr->setpos( los->pos );
return 0;
}else{
NnString cmdline;
fpos_t start;
fr->getpos( start );
for(;;){
Status rc=this->readcommand(cmdline);
if( rc == TERMINATE ){
fr->setpos( start );
return 0;
}
cmdline.trim();
if( cmdline.at(0) == ':' ){
NnString label2( cmdline.chars()+1 );
label2.trim();
if( label2.length() > 0 ){
setLabel( label2 );
if( label2.compare(label)==0 )
return 0;
}
}
}
}
}
int ScriptShell::addArgv( const NnString &arg )
{
NnObject *element = arg.clone();
if( element == NULL )
return -1;
return argv_.append( element );
}