@@ -34,6 +34,8 @@ public class ASTCompositeTerm extends ASTTerm
3434 public static Type doubleType = new Type("double", null);
3535 public static Type voidType = new Type("void", null);
3636
37+ public static Statement skipStatement =
38+ new InvocationStatement("skip");
3739
3840 public ASTCompositeTerm(String t)
3941 { tag = t;
@@ -5612,6 +5614,83 @@ public Statement cfunctioncallPresideeffect(String fname,
56125614 sqstat.addStatement(forstat);
56135615 return sqstat;
56145616 }
5617+ else if ("strtok".equals(fname) && args.size() == 2)
5618+ { // if s /= "" then _tok_string := s else skip ;
5619+ // if _tok_string->hasMatch(ct)
5620+ // then tok_token := _tok_string->firstMatch(ct);
5621+ // _tok_ind := _tok_string->indexOf(_tok_token) + _tok_token.size;
5622+ // _tok_string := _tok_string.substring(_tok_ind)
5623+ // else _tok_token := ""; _tok_ind := 0;
5624+ // _tok_string := ""
5625+
5626+ Expression s = (Expression) args.get(0);
5627+ Expression ct = (Expression) args.get(1);
5628+ s.setType(new Type("String", null));
5629+ ct.setType(new Type("String", null));
5630+
5631+ Expression indexexpr =
5632+ BasicExpression.newVariableBasicExpression("_tok_ind");
5633+ indexexpr.setType(new Type("int", null));
5634+ Expression tokenexpr =
5635+ BasicExpression.newVariableBasicExpression(
5636+ "_tok_token");
5637+ tokenexpr.setType(new Type("String", null));
5638+ Expression tokstringexpr =
5639+ BasicExpression.newVariableBasicExpression(
5640+ "_tok_string");
5641+ tokstringexpr.setType(new Type("String", null));
5642+
5643+ Expression nonempty =
5644+ new BinaryExpression("/=",s,emptyStringExpression);
5645+ nonempty.setType(new Type("boolean", null));
5646+ AssignStatement assigns =
5647+ new AssignStatement(tokstringexpr, s);
5648+ ConditionalStatement cond1 =
5649+ new ConditionalStatement(
5650+ nonempty,assigns,skipStatement);
5651+
5652+ SequenceStatement stat0 = new SequenceStatement();
5653+ AssignStatement asgn1 =
5654+ new AssignStatement(tokenexpr,
5655+ new BinaryExpression("->firstMatch",
5656+ tokstringexpr, ct));
5657+ stat0.addStatement(asgn1);
5658+ Expression indof =
5659+ new BinaryExpression("->indexOf", tokstringexpr, ct);
5660+ Expression sizetok =
5661+ new UnaryExpression("->size", tokenexpr);
5662+ AssignStatement asgn2 =
5663+ new AssignStatement(indexexpr,
5664+ new BinaryExpression("+", indof, sizetok));
5665+ stat0.addStatement(asgn2);
5666+ Expression substr =
5667+ BasicExpression.newFunctionBasicExpression("substring",
5668+ tokstringexpr, indexexpr);
5669+ AssignStatement asgn3 =
5670+ new AssignStatement(tokstringexpr, substr);
5671+ stat0.addStatement(asgn3);
5672+
5673+ SequenceStatement stat1 = new SequenceStatement();
5674+ AssignStatement asgn4 =
5675+ new AssignStatement(tokenexpr, emptyStringExpression);
5676+ stat1.addStatement(asgn4);
5677+ AssignStatement asgn5 =
5678+ new AssignStatement(indexexpr, zeroExpression);
5679+ stat1.addStatement(asgn5);
5680+ AssignStatement asgn6 =
5681+ new AssignStatement(
5682+ tokstringexpr, emptyStringExpression);
5683+ stat1.addStatement(asgn6);
5684+
5685+ Expression test =
5686+ new BinaryExpression("->hasMatch", tokstringexpr, ct);
5687+ ConditionalStatement cond2 =
5688+ new ConditionalStatement(test,stat0,stat1);
5689+ SequenceStatement res = new SequenceStatement();
5690+ res.addStatement(cond1);
5691+ res.addStatement(cond2);
5692+ return res;
5693+ }
56155694
56165695 return null;
56175696 }
@@ -5629,7 +5708,7 @@ public Statement cfunctioncallUpdateForm(String fname,
56295708 Expression arg1 = (Expression) args.get(1);
56305709 arg1.setType(new Type("String", null));
56315710 return new AssignStatement(arg0, arg1);
5632- } // and side-effect
5711+ }
56335712 else if ("strncpy".equals(fname) && args.size() == 3)
56345713 { Expression arg0 = (Expression) args.get(0);
56355714 Expression arg1 = (Expression) args.get(1);
@@ -5642,7 +5721,7 @@ else if ("strncpy".equals(fname) && args.size() == 3)
56425721 BasicExpression.newFunctionBasicExpression("subrange", arg1, pars);
56435722 fbe.setType(new Type("String", null));
56445723 return new AssignStatement(arg0, fbe);
5645- } // and side-effect
5724+ }
56465725 else if (("memcpy".equals(fname) ||
56475726 "memmove".equals(fname)) && args.size() == 3)
56485727 { // for i : 0..argn-1
@@ -6950,6 +7029,13 @@ else if ("strncmp".equals(fname) && args.size() == 3)
69507029 res.setType(new Type("int", null));
69517030 return res;
69527031 }
7032+ else if ("strtok".equals(fname) && args.size() == 2)
7033+ { Expression tokenexpr =
7034+ BasicExpression.newVariableBasicExpression(
7035+ "_tok_token");
7036+ tokenexpr.setType(new Type("String", null));
7037+ return tokenexpr;
7038+ }
69537039 else if ("memcmp".equals(fname) && args.size() == 3)
69547040 { // arg1.subrange(1,n)->compareTo(arg2.subrange(1,n))
69557041 Expression arg1 = (Expression) args.get(0);
0 commit comments