Bug fixes
[rodin/chimara.git] / interpreters / glulxe / gestalt.c
1 /* gestalt.c: Glulxe code for gestalt selectors
2     Designed by Andrew Plotkin <erkyrath@eblong.com>
3     http://eblong.com/zarf/glulx/index.html
4 */
5
6 #include "glk.h"
7 #include "glulxe.h"
8 #include "gestalt.h"
9
10 glui32 do_gestalt(glui32 val, glui32 val2)
11 {
12   switch (val) {
13
14   case gestulx_GlulxVersion:
15     return 0x00030101; /* Glulx spec version 3.1.1 */
16
17   case gestulx_TerpVersion:
18     return 0x00000404; /* Glulxe version 0.4.4 */
19
20   case gestulx_ResizeMem:
21 #ifdef FIXED_MEMSIZE
22     return 0; /* The setmemsize opcodes are compiled out. */
23 #else /* FIXED_MEMSIZE */
24     return 1; /* We can handle setmemsize. */
25 #endif /* FIXED_MEMSIZE */
26
27   case gestulx_Undo:
28     return 1; /* We can handle saveundo and restoreundo. */
29
30   case gestulx_IOSystem:
31     switch (val2) {
32     case 0:
33       return 1; /* The "null" system always works. */
34     case 1:
35       return 1; /* The "filter" system always works. */
36     case 2:
37       return 1; /* A Glk library is hooked up. */
38     default:
39       return 0;
40     }
41
42   case gestulx_Unicode:
43     return 1; /* We can handle Unicode. */
44
45   case gestulx_MemCopy:
46     return 1; /* We can do mcopy/mzero. */
47
48   case gestulx_MAlloc:
49 #ifdef FIXED_MEMSIZE
50     return 0; /* The malloc opcodes are compiled out. */
51 #else /* FIXED_MEMSIZE */
52     return 1; /* We can handle malloc/mfree. */
53 #endif /* FIXED_MEMSIZE */
54
55   case gestulx_MAllocHeap:
56     return heap_get_start();
57
58   case gestulx_Acceleration:
59     return 1; /* We can do accelfunc/accelparam. */
60
61   case gestulx_AccelFunc:
62     if (accel_find_func(val2))
63       return 1; /* We know this accelerated function. */
64     return 0;
65
66   default:
67     return 0;
68
69   }
70 }