1 package com.tapina.robe.swi.clib.stdio;
2
3 import com.tapina.robe.swi.clib.Stub;
4 import com.tapina.robe.swi.clib.VarArgs;
5 import com.tapina.robe.swi.clib.stdio.printf.PrintfEngine;
6 import com.tapina.robe.runtime.Environment;
7 import com.tapina.robe.runtime.MemoryMap;
8
9 /***
10 * This function is identical to sprintf, but the arguments are replaced by a3, which should have been initialised
11 * by va_start.
12 * Returns: The number of characters output, or a negative value if there was an error.
13 */
14 public class VSPrintF extends Stub {
15 public void executeStub(Environment environment) {
16
17
18
19
20
21
22
23
24
25
26
27 final int[] R = environment.getCpu().R;
28 final MemoryMap memoryMap = environment.getMemoryMap();
29 final String formatString = memoryMap.getString0(R[1]);
30
31 final String out = PrintfEngine.getInstance().sprintf(formatString, new VarArgs(memoryMap, memoryMap.getWord(R[2])));
32 memoryMap.storeString0(R[0], out);
33 R[0] = out.length();
34
35 }
36 }