View Javadoc

1   package com.tapina.robe.swi.clib.stdio;
2   
3   import com.tapina.robe.runtime.Environment;
4   import com.tapina.robe.swi.clib.Stub;
5   
6   import java.io.IOException;
7   
8   /***
9    * This function sets the file position indicator for the file pointed to by a1. The position is set using a
10   * combination of a2 and a3. a2 gives the offset from the position set in a3. a3 should be either SEEK_SET ,
11   * SEEK_CUR or SEEK_END . For files not opened in binary mode, pos should be either zero, or a value returned by ftell
12   * with from equal to SEEK_SET.
13   * Returns: Zero if successful.
14   */
15  public class FSeek extends Stub {
16      public static final int SEEK_SET = 0;
17      public static final int SEEK_CUR = 1;
18      public static final int SEEK_END = 2;
19  
20      public void executeStub(Environment environment) {
21          final int[] R = environment.getCpu().R;
22          FilePointer filePointer = FilePointer.find(environment.getMemoryMap().getWord(R[0]));
23          try {
24              switch (R[2]) {
25                  case SEEK_SET:
26                      filePointer.setPosition(R[1]);
27                      break;
28                  case SEEK_CUR:
29                      filePointer.setPosition(filePointer.getPosition() + R[1]);
30                      break;
31                  case SEEK_END:
32                      filePointer.setPosition(filePointer.getExtent() + R[1]);
33                      break;
34                  default:
35                      log.severe("Unknown fseek(): " + R[2]);
36                      R[0] = -1;
37                      return;
38              }
39              R[0] = 0;
40          } catch (IOException e) {
41              log.warning("Error during fseek(): " + e.getMessage());
42              R[0] = -1;
43          }
44      }
45  }