Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions build.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<project name="cgpipe" default="jar">
<property name="version" value="0.5.15"/>
<property name="version" value="0.5.16"/>
<property name="lib.dir" value="lib"/>
<property name="blib.dir" value="blib"/>
<property name="build.dir" value="build"/>
Expand Down Expand Up @@ -29,7 +29,7 @@
includeantruntime="false"
classpathref="classpath"
debuglevel="lines,vars,source"
release="8"
release="11"
>
<compilerarg value="-Xlint:deprecation"/>
</javac>
Expand Down
147 changes: 87 additions & 60 deletions src/java/io/compgen/cgpipe/parser/node/IteratingNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ public IteratingNode(ASTNode parent, TokenList tokens) throws ASTParseException
int preCount = 0;
int postCount = 0;
boolean pre = true;
boolean in = false;
for (int i=0; i<tokens.size(); i++) {
if (pre) {
if (tokens.get(i).isStatement() && tokens.get(i).getStatement() == Statement.IN) {
pre = false;
in = true;
} else if (tokens.get(i).isComma()) {
preCount++;
}
Expand All @@ -45,41 +47,48 @@ public IteratingNode(ASTNode parent, TokenList tokens) throws ASTParseException
}
}

if (preCount != postCount || pre) {
throw new ASTParseException("Invalid for-loop syntax!", tokens);
}

if (in) {
if (preCount != postCount || pre) {
throw new ASTParseException("Invalid for-loop syntax!", tokens);
}

varName = new String[preCount+1];
iterTokens = new TokenList[postCount+1];

pre=true;
int preIdx = 0;
int postIdx = 0;
List<Token> buf = new ArrayList<Token>();
for (int i=0; i<tokens.size(); i++) {
if (pre) {
if (tokens.get(i).isStatement() && tokens.get(i).getStatement() == Statement.IN) {
pre = false;
} else if (tokens.get(i).isComma()) {
//skip
} else if (tokens.get(i).isVariable()) {
varName[preIdx++] = tokens.get(i).getStr();
} else {
throw new ASTParseException("Invalid for-loop syntax!", tokens);
}
} else {
if (tokens.get(i).isComma()) {
iterTokens[postIdx++] = new TokenList(buf, tokens.getLine());
buf.clear();
varName = new String[preCount+1];
iterTokens = new TokenList[postCount+1];

pre=true;
int preIdx = 0;
int postIdx = 0;
List<Token> buf = new ArrayList<Token>();
for (int i=0; i<tokens.size(); i++) {
if (pre) {
if (tokens.get(i).isStatement() && tokens.get(i).getStatement() == Statement.IN) {
pre = false;
} else if (tokens.get(i).isComma()) {
//skip
} else if (tokens.get(i).isVariable()) {
varName[preIdx++] = tokens.get(i).getStr();
} else {
throw new ASTParseException("Invalid for-loop syntax!", tokens);
}
} else {
buf.add(tokens.get(i));
if (tokens.get(i).isComma()) {
iterTokens[postIdx++] = new TokenList(buf, tokens.getLine());
buf.clear();
} else {
buf.add(tokens.get(i));
}
}
}
}

if (buf.size()>0) {
iterTokens[postIdx++] = new TokenList(buf, tokens.getLine());

if (buf.size()>0) {
iterTokens[postIdx++] = new TokenList(buf, tokens.getLine());
}
} else {
// no 'IN' so we must be a for-while loop
iterTokens = new TokenList[1];
iterTokens[0] = tokens;
varName = null;

}
}

Expand Down Expand Up @@ -124,42 +133,60 @@ public ASTNode exec(ExecContext context) throws ASTExecException {
throw new ASTExecException("Missing done for for-loop", tokens);
}

List<Iterator<VarValue>> iterVals = new ArrayList<Iterator<VarValue>>();

for (int i=0; i<iterTokens.length; i++) {
VarValue val = Eval.evalTokenExpression(iterTokens[i], context);
if (val == VarNull.NULL) {
return next;
}
iterVals.add(val.iterate().iterator());
}

while (true) {
VarValue[] vals = new VarValue[iterVals.size()];
for (int i=0; i<vals.length; i++) {
if (!iterVals.get(i).hasNext()) {
if (varName != null) {
// for xx in yy loop
List<Iterator<VarValue>> iterVals = new ArrayList<Iterator<VarValue>>();

for (int i=0; i<iterTokens.length; i++) {
VarValue val = Eval.evalTokenExpression(iterTokens[i], context);
if (val == VarNull.NULL) {
return next;
}
vals[i] = iterVals.get(i).next();
}

ExecContext nested = new ExecContext(context);

for (int i=0; i<varName.length;i++) {
nested.set(varName[i], vals[i]);
iterVals.add(val.iterate().iterator());
}

ASTNode currentNode = headNode;

while (currentNode != null) {
currentNode = currentNode.exec(nested);
while (true) {
VarValue[] vals = new VarValue[iterVals.size()];
for (int i=0; i<vals.length; i++) {
if (!iterVals.get(i).hasNext()) {
return next;
}
vals[i] = iterVals.get(i).next();
}

ExecContext nested = new ExecContext(context);

for (int i=0; i<varName.length;i++) {
nested.set(varName[i], vals[i]);
}

ASTNode currentNode = headNode;

while (currentNode != null) {
currentNode = currentNode.exec(nested);
}

for (int i=0; i<varName.length;i++) {
nested.remove(varName[i]);
}

}

for (int i=0; i<varName.length;i++) {
nested.remove(varName[i]);
} else {
// for test while loop
while (true) {
VarValue val = Eval.evalTokenExpression(iterTokens[0], context);
// System.err.println(" ==> evaluating: "+iterTokens[0]+" <== " + val + " | "+this);
if (!val.toBoolean()) {
return next;
}
ExecContext nested = new ExecContext(context);
ASTNode currentNode = headNode;
while (currentNode != null) {
currentNode = currentNode.exec(nested);
}
}

}

}

public void done() {
Expand Down
3 changes: 2 additions & 1 deletion src/java/io/compgen/cgpipe/runner/BatchQTemplateRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ public boolean isJobIdValid(String jobId) throws RunnerException {
if (spl[1].equals("QUEUED") ||
spl[1].equals("WAITING") ||
spl[1].equals("RUNNING") ||
spl[1].equals("USERHOLD") ) {
spl[1].equals("USERHOLD") ||
spl[1].equals("PROXYQUEUED") ) {
return true;
}
}
Expand Down
17 changes: 17 additions & 0 deletions src/test-scripts/while.mvpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
i=1
for i < 10
print i
i = i + 1
done

val = true
for val
print "here"
val = false
done

val = false
for val
print "nope"
done

9 changes: 9 additions & 0 deletions src/test-scripts/while.mvpt.good
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
1
2
3
4
5
6
7
8
9