fixed bug in prepareStackForAbsOpt (rtemgr.c).
[bugg-scheme-compiler.git] / src / c / scheme.h~
blobc61f0ed23496106ff68bc174f0b8322c8cbc4c58
1 /* scheme.h
2  * A header file that defines the basic Scheme data types, etc. Used
3  * with the scheme->c compiler.
4  * Programmer: Mayer Goldberg, 2000
5  */
7 #ifndef __SCHEME_H
8 #define __SCHEME_H
10 #ifndef NULL
11 #define NULL ((void *)0)
12 #endif
14 typedef enum SchemeType {
15   SCHEME_VOID,
16     SCHEME_TYPE_FIRST = SCHEME_VOID,
17   SCHEME_INT,
18   SCHEME_CHAR,
19   SCHEME_BOOL,
20   SCHEME_STRING,
21   SCHEME_NIL,
22   SCHEME_PAIR,
23   SCHEME_VECTOR,
24   SCHEME_SYMBOL,
25   SCHEME_CLOSURE,
26   SCHEME_TYPE_END /* not to be used */
27 } SchemeType;
29 /* basic support for scheme objects */
31 typedef struct SchemeIntData {
32   int value;
33 } SchemeIntData;
35 typedef struct SchemeCharData {
36   char value;
37 } SchemeCharData;
39 typedef struct SchemeBoolData {
40   int value;
41 } SchemeBoolData;
43 typedef struct SchemeStringData {
44   int length;
45   char *value;
46 } SchemeStringData;
48 typedef struct SchemePairData {
49   struct SchemeObject *car, *cdr;
50 } SchemePairData;
52 typedef struct SchemeVectorData {
53   int length;
54   struct SchemeObject **vec; 
55 } SchemeVectorData;
57 typedef struct SchemeSymbolData {
58   struct SymbolEntry *sep;
59 } SchemeSymbolData;
61 typedef struct SchemeClosureData {
62   struct SchemeObject **env;
63   void *code;
64 } SchemeClosureData;
66 typedef union SchemeObjectData {
67   struct SchemeIntData sid;
68   struct SchemeCharData scd;
69   struct SchemeBoolData sbd;
70   struct SchemeStringData ssd;
71   struct SchemePairData spd;
72   struct SchemeVectorData svd;
73   struct SchemeSymbolData smd;
74   struct SchemeClosureData scld;
75 } SchemeObjectData;
77 typedef struct SchemeObject {
78   SchemeType type;
79   SchemeObjectData *schemeObjectData;
80 } SchemeObject;
82 #define VOID(x)                  ((void *) (x))
83 #define SOB(x)                   ((SchemeObject *) (x))
84 #define SOD(x)                   ((SchemeObjectData *) (x))
85 #define SOB_TYPE(x)              SOB((x))->type
86 #define SOB_DATA(x)              SOB((x))->schemeObjectData
88 #define IS_SOB_VOID(x)           (SOB((x))->type == SCHEME_VOID)
89 #define IS_SOB_INT(x)            (SOB((x))->type == SCHEME_INT)
90 #define IS_SOB_CHAR(x)           (SOB((x))->type == SCHEME_CHAR)
91 #define IS_SOB_BOOL(x)           (SOB((x))->type == SCHEME_BOOL)
92 #define IS_SOB_STRING(x)         (SOB((x))->type == SCHEME_STRING)
93 #define IS_SOB_NIL(x)            (SOB((x))->type == SCHEME_NIL)
94 #define IS_SOB_PAIR(x)           (SOB((x))->type == SCHEME_PAIR)
95 #define IS_SOB_VECTOR(x)         (SOB((x))->type == SCHEME_VECTOR)
96 #define IS_SOB_SYMBOL(x)         (SOB((x))->type == SCHEME_SYMBOL)
97 #define IS_SOB_CLOSURE(x)        (SOB((x))->type == SCHEME_CLOSURE)
99 #define SOB_INT_VALUE(x)           SOB_DATA((x))->sid.value
100 #define SOB_CHAR_VALUE(x)          SOB_DATA((x))->scd.value
101 #define SOB_BOOL_VALUE(x)          SOB_DATA((x))->sbd.value
102 #define SOB_STRING_LENGTH(x)       SOB_DATA((x))->ssd.length
103 #define SOB_STRING_VALUE(x)        SOB_DATA((x))->ssd.value
104 #define SOB_STRING_REF(x, i)       SOB_STRING_VALUE((x))[i]
105 #define SOB_STRING_SET(x, i, c)    SOB_STRING_VALUE((x))[i] = c
106 #define SOB_PAIR_CAR(x)            SOB_DATA((x))->spd.car
107 #define SOB_PAIR_CDR(x)            SOB_DATA((x))->spd.cdr
108 #define SOB_VECTOR_LENGTH(x)       SOB_DATA((x))->svd.length
109 #define SOB_VECTOR_VALUE(x)        SOB_DATA((x))->svd.vec
110 #define SOB_VECTOR_REF(x, i)       SOB_VECTOR_VALUE((x))[i]
111 #define SOB_VECTOR_SET(x, i, sob)  SOB_VECTOR_VALUE((x))[i] = sob
112 #define SOB_SYMBOL_ENTRY(x)        SOB_DATA((x))->smd.sep
113 #define SOB_SYMBOL_HAS_VALUE(x)    SOB_SYMBOL_ENTRY((x))->isDefined
114 #define SOB_SYMBOL_NAME(x)         SOB_SYMBOL_ENTRY((x))->name
115 #define SOB_SYMBOL_VALUE(x)        SOB_SYMBOL_ENTRY((x))->sob
116 #define SOB_CLOSURE_ENV(x)         SOB_DATA((x))->scld.env
117 #define SOB_CLOSURE_CODE(x)        SOB_DATA((x))->scld.code
119 #define SOB_BOOL_FALSE(x) (IS_SOB_BOOL(x) && (SOB_BOOL_VALUE(x) == 0))
121 SchemeObject *makeSchemeObject();
122 SchemeObject *makeSchemeVoid();
123 SchemeObject *makeSchemeInt(int n);
124 SchemeObject *makeSchemeChar(char c);
125 SchemeObject *makeSchemeBool(int b);
126 SchemeObject *makeSchemeString(int n, char c);
127 SchemeObject *makeSchemeStringFromCString(char *s);
128 SchemeObject *makeSchemeNil();
129 SchemeObject *makeSchemePair(SchemeObject *car, SchemeObject *cdr);
130 SchemeObject *makeSchemeVectorInit(int n, SchemeObject *initSob);
131 SchemeObject *makeSchemeSymbol(char *s);
132 SchemeObject *makeSchemeClosure(void* env,void* code);
134 char *sobToString(SchemeObject *sob);
136 /* I am too lazy to think up a good hash function, so I'm not using a
137  * hash table but rather a binary tree. Of course, the performance for
138  * free variable look up will not be as good, but the implementation
139  * details are hidden behind an API, and can therefore be changed
140  * later.  
141  */
143 typedef struct SymbolEntry {
144   char *name;
145   int isDefined;
146   SchemeObject *sob;
147 } SymbolEntry;
149 typedef struct SymbolNode {
150   SymbolEntry *sym;
151   struct SymbolNode *left, *right;
152 } SymbolNode;
154 #define SYM_ENTRY(symNode)     ((SymbolNode *)symNode)->sym
155 #define SYM_NAME(symNode)      SYM_ENTRY((symNode))->name
156 #define SYM_HAS_VALUE(symNode) SYM_ENTRY((symNode))->isDefined
157 #define SYM_VALUE(symNode)     SYM_ENTRY((symNode))->sob
158 #define SYM_LEFT(symNode)      ((symNode))->left
159 #define SYM_RIGHT(symNode)     ((symNode))->right
161 SymbolEntry *probeSymbolDefined(char *name, SymbolNode *t);
162 SymbolEntry *getSymbol(char *name, SymbolNode *t);
164 /* this is intended for future support for the garbage collector */
166 void *autoMalloc(int n);
167 void autoFree(void *p);
169 /* this is the name of the function created by our compiler */
171 void schemeCompiledFunction();
173 #endif