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   import com.tapina.robe.swi.clib.stdio.printf.PrintfEngine;
8   
9   import java.io.IOException;
10  
11  /***
12   * This function writes output to the stream a1 under control of the format string a2.
13   * If there are more arguments than conversion specifications, the extra arguments are evaluated but not used.
14   * Returns: The number of characters written, or a negative value if there was an error.
15   */
16  public class FPrintF extends Stub {
17      public void executeStub(Environment environment) {
18          final int[] R = environment.getCpu().R;
19          final MemoryMap memoryMap = environment.getMemoryMap();
20          final String formatString = memoryMap.getString0(R[1]);
21          // NB: varargs are treated as normal arguments (i.e. passed in a1, a2, a3, a4 then stack).
22          String out = PrintfEngine.getInstance().sprintf(formatString, new VarArgs(environment, 2));
23          final FilePointer filePointer = FilePointer.find(memoryMap.getWord(R[0]));
24          try {
25              filePointer.puts(out);
26              R[0] = out.length();
27          } catch (IOException e) {
28              log.warning("Error during fprintf(): " + e.getMessage());
29              R[0] = -1;
30          }
31      }
32  }