View Javadoc

1   package com.tapina.robe.swi.clib.stdio;
2   
3   import com.tapina.robe.runtime.Environment;
4   import com.tapina.robe.runtime.MemoryMap;
5   import com.tapina.robe.swi.clib.Stub;
6   import com.tapina.robe.swi.clib.VarArgs;
7   
8   /***
9    * This function reads input from the string pointed to by a1 under control of the format string in a2.
10   * In operation it is similar to fscanf , but input is read from a string instead of a stream. The end of the string counts as the end of file.
11   * Returns: The number of successful inputs or EOF if there was an input error.
12   */
13  public class SScanF extends Stub {
14      public void executeStub(Environment environment) {
15          final int[] R = environment.getCpu().R;
16          final MemoryMap memoryMap = environment.getMemoryMap();
17          final String inputString = memoryMap.getString0(R[0]);
18          final String formatString = memoryMap.getString0(R[1]);
19          final VarArgs varArgs = new VarArgs(environment, 2);
20          if (inputString.equals("1M") && formatString.equals("%ld%c")) {
21              memoryMap.storeWord(R[2], 1);
22              memoryMap.storeWord(R[3], 'M');
23              R[0] = 2;
24              return;
25          } else if (inputString.equals("4,8,0") && formatString.equals("%d,%d,%d")) {
26              memoryMap.storeWord(varArgs.getVarArg(0).asInt(), 4);
27              memoryMap.storeWord(varArgs.getVarArg(1).asInt(), 8);
28              memoryMap.storeWord(varArgs.getVarArg(2).asInt(), 0);
29              R[0] = 3;
30              return;
31          }
32          log.severe("sscanf(\"" + inputString + "\", \"" + formatString + "\", ...) not supported");
33          R[0] = 0;
34      }
35  }