Initialize Tizen 2.3
[framework/uifw/embryo.git] / mobile / src / bin / embryo_cc_amx.h
1 /*  Abstract Machine for the Small compiler
2  *
3  *  Copyright (c) ITB CompuPhase, 1997-2003
4  *
5  *  This software is provided "as-is", without any express or implied warranty.
6  *  In no event will the authors be held liable for any damages arising from
7  *  the use of this software.
8  *
9  *  Permission is granted to anyone to use this software for any purpose,
10  *  including commercial applications, and to alter it and redistribute it
11  *  freely, subject to the following restrictions:
12  *
13  *  1.  The origin of this software must not be misrepresented; you must not
14  *      claim that you wrote the original software. If you use this software in
15  *      a product, an acknowledgment in the product documentation would be
16  *      appreciated but is not required.
17  *  2.  Altered source versions must be plainly marked as such, and must not be
18  *      misrepresented as being the original software.
19  *  3.  This notice may not be removed or altered from any source distribution.
20  *
21  *  Version: $Id$
22  */
23
24 #ifndef EMBRYO_CC_AMX_H
25 #define EMBRYO_CC_AMX_H
26
27 #include <sys/types.h>
28
29 /* calling convention for all interface functions and callback functions */
30
31 /* File format version                          Required AMX version
32  *   0 (original version)                       0
33  *   1 (opcodes JUMP.pri, SWITCH and CASETBL)   1
34  *   2 (compressed files)                       2
35  *   3 (public variables)                       2
36  *   4 (opcodes SWAP.pri/alt and PUSHADDR)      4
37  *   5 (tagnames table)                         4
38  *   6 (reformatted header)                     6
39  *   7 (name table, opcodes SYMTAG & SYSREQ.D)  7
40  */
41 #define CUR_FILE_VERSION  7     /* current file version; also the current AMX version */
42 #define MIN_FILE_VERSION  6     /* lowest supported file format version for the current AMX version */
43 #define MIN_AMX_VERSION   7     /* minimum AMX version needed to support the current file format */
44
45 #if !defined CELL_TYPE
46 #define CELL_TYPE
47    typedef unsigned int    ucell;
48    typedef int     cell;
49 #endif
50
51    struct tagAMX;
52    typedef             cell(*AMX_NATIVE) (struct tagAMX * amx,
53                                                            cell * params);
54    typedef int         (* AMX_CALLBACK) (struct tagAMX * amx, cell index,
55                                                 cell * result, cell * params);
56    typedef int         (* AMX_DEBUG) (struct tagAMX * amx);
57
58    typedef struct
59    {
60       char          *name;
61       AMX_NATIVE func    ;
62    } AMX_NATIVE_INFO  ;
63
64 #define AMX_USERNUM     4
65 #define sEXPMAX         19      /* maximum name length for file version <= 6 */
66 #define sNAMEMAX        31      /* maximum name length of symbol name */
67
68 #if defined (_MSC_VER) || (defined (__SUNPRO_C) && __SUNPRO_C < 0x5100)
69 # pragma pack(1)
70 # define EMBRYO_STRUCT_PACKED
71 #elif defined (__GNUC__) || (defined (__SUNPRO_C) && __SUNPRO_C >= 0x5100)
72 # define EMBRYO_STRUCT_PACKED __attribute__((packed))
73 #else
74 # define EMBRYO_STRUCT_PACKED
75 #endif
76
77    typedef struct tagAMX_FUNCSTUB
78    {
79       unsigned int        address;
80       char                name[sEXPMAX + 1];
81    } EMBRYO_STRUCT_PACKED AMX_FUNCSTUB;
82
83 /* The AMX structure is the internal structure for many functions. Not all
84  * fields are valid at all times; many fields are cached in local variables.
85  */
86    typedef struct tagAMX
87    {
88       unsigned char *base;      /* points to the AMX header ("amxhdr") plus the code, optionally also the data */
89       unsigned char *data;      /* points to separate data+stack+heap, may be NULL */
90       AMX_CALLBACK callback;
91       AMX_DEBUG debug    ;      /* debug callback */
92       /* for external functions a few registers must be accessible from the outside */
93       cell cip           ;      /* instruction pointer: relative to base + amxhdr->cod */
94       cell frm           ;      /* stack frame base: relative to base + amxhdr->dat */
95       cell hea           ;      /* top of the heap: relative to base + amxhdr->dat */
96       cell hlw           ;      /* bottom of the heap: relative to base + amxhdr->dat */
97       cell stk           ;      /* stack pointer: relative to base + amxhdr->dat */
98       cell stp           ;      /* top of the stack: relative to base + amxhdr->dat */
99       int flags          ;      /* current status, see amx_Flags() */
100       /* for assertions and debug hook */
101       cell curline       ;
102       cell curfile       ;
103       int dbgcode        ;
104       cell dbgaddr       ;
105       cell dbgparam      ;
106       char          *dbgname;
107       /* user data */
108       long                usertags[AMX_USERNUM];
109       void          *userdata[AMX_USERNUM];
110       /* native functions can raise an error */
111       int error          ;
112       /* the sleep opcode needs to store the full AMX status */
113       cell pri           ;
114       cell alt           ;
115       cell reset_stk     ;
116       cell reset_hea     ;
117       cell          *syscall_d; /* relocated value/address for the SYSCALL.D opcode */
118    } EMBRYO_STRUCT_PACKED AMX;
119
120 /* The AMX_HEADER structure is both the memory format as the file format. The
121  * structure is used internaly.
122  */
123    typedef struct tagAMX_HEADER
124    {
125       int size       ;  /* size of the "file" */
126       unsigned short magic     ;        /* signature */
127       char file_version  ;      /* file format version */
128       char amx_version   ;      /* required version of the AMX */
129       unsigned short flags      ;
130       unsigned short defsize    ;       /* size of a definition record */
131       int cod        ;  /* initial value of COD - code block */
132       int dat        ;  /* initial value of DAT - data block */
133       int hea        ;  /* initial value of HEA - start of the heap */
134       int stp        ;  /* initial value of STP - stack top */
135       int cip        ;  /* initial value of CIP - the instruction pointer */
136       int publics    ;  /* offset to the "public functions" table */
137       int natives    ;  /* offset to the "native functions" table */
138       int libraries  ;  /* offset to the table of libraries */
139       int pubvars    ;  /* the "public variables" table */
140       int tags       ;  /* the "public tagnames" table */
141       int nametable  ;  /* name table, file version 7 only */
142    } EMBRYO_STRUCT_PACKED AMX_HEADER;
143
144 #if defined _MSC_VER || (defined (__SUNPRO_C) && __SUNPRO_C < 0x5100)
145 # pragma pack()
146 #endif
147
148 #define AMX_MAGIC       0xf1e0
149
150    enum
151    {
152       AMX_ERR_NONE,
153       /* reserve the first 15 error codes for exit codes of the abstract machine */
154       AMX_ERR_EXIT,             /* forced exit */
155       AMX_ERR_ASSERT,           /* assertion failed */
156       AMX_ERR_STACKERR,         /* stack/heap collision */
157       AMX_ERR_BOUNDS,           /* index out of bounds */
158       AMX_ERR_MEMACCESS,        /* invalid memory access */
159       AMX_ERR_INVINSTR,         /* invalid instruction */
160       AMX_ERR_STACKLOW,         /* stack underflow */
161       AMX_ERR_HEAPLOW,          /* heap underflow */
162       AMX_ERR_CALLBACK,         /* no callback, or invalid callback */
163       AMX_ERR_NATIVE,           /* native function failed */
164       AMX_ERR_DIVIDE,           /* divide by zero */
165       AMX_ERR_SLEEP,            /* go into sleepmode - code can be restarted */
166
167       AMX_ERR_MEMORY = 16,      /* out of memory */
168       AMX_ERR_FORMAT,           /* invalid file format */
169       AMX_ERR_VERSION,          /* file is for a newer version of the AMX */
170       AMX_ERR_NOTFOUND,         /* function not found */
171       AMX_ERR_INDEX,            /* invalid index parameter (bad entry point) */
172       AMX_ERR_DEBUG,            /* debugger cannot run */
173       AMX_ERR_INIT,             /* AMX not initialized (or doubly initialized) */
174       AMX_ERR_USERDATA,         /* unable to set user data field (table full) */
175       AMX_ERR_INIT_JIT,         /* cannot initialize the JIT */
176       AMX_ERR_PARAMS,           /* parameter error */
177       AMX_ERR_DOMAIN,           /* domain error, expression result does not fit in range */
178    };
179
180    enum
181    {
182       DBG_INIT,                 /* query/initialize */
183       DBG_FILE,                 /* file number in curfile, filename in name */
184       DBG_LINE,                 /* line number in curline, file number in curfile */
185       DBG_SYMBOL,               /* address in dbgaddr, class/type in dbgparam */
186       DBG_CLRSYM,               /* stack address below which locals should be removed. stack address in stk */
187       DBG_CALL,                 /* function call, address jumped to in dbgaddr */
188       DBG_RETURN,               /* function returns */
189       DBG_TERMINATE,            /* program ends, code address in dbgaddr, reason in dbgparam */
190       DBG_SRANGE,               /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
191       DBG_SYMTAG,               /* tag of the most recent symbol (if non-zero), tag in dbgparam */
192    };
193
194 #define AMX_FLAG_CHAR16   0x01  /* characters are 16-bit */
195 #define AMX_FLAG_DEBUG    0x02  /* symbolic info. available */
196 #define AMX_FLAG_COMPACT  0x04  /* compact encoding */
197 #define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
198 #define AMX_FLAG_NOCHECKS  0x10 /* no array bounds checking */
199 #define AMX_FLAG_BROWSE 0x4000  /* browsing/relocating or executing */
200 #define AMX_FLAG_RELOC  0x8000  /* jump/call addresses relocated */
201
202 #define AMX_EXEC_MAIN   -1      /* start at program entry point */
203 #define AMX_EXEC_CONT   -2      /* continue from last address */
204
205 #define AMX_USERTAG(a,b,c,d)    ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24))
206
207 #define AMX_EXPANDMARGIN  64
208
209 /* for native functions that use floating point parameters, the following
210  * two macros are convenient for casting a "cell" into a "float" type _without_
211  * changing the bit pattern
212  */
213 #define amx_ftoc(f)     ( * ((cell*)&f) )       /* float to cell */
214 #define amx_ctof(c)     ( * ((float*)&c) )      /* cell to float */
215
216 #define amx_StrParam(amx,param,result) {                             \
217             cell *amx_cstr_; int amx_length_;                        \
218             amx_GetAddr((amx), (param), &amx_cstr_);                 \
219             amx_StrLen(amx_cstr_, &amx_length_);                     \
220             if (amx_length_ > 0 &&                                   \
221                 ((result) = (char *)alloca(amx_length_ + 1))) \
222               amx_GetString((result), amx_cstr_);                    \
223             else (result) = NULL;                                    \
224 }
225
226 #endif                          /* __AMX_H */