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
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 }