1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* hgvm.h
* Copyright (C) 2005-2011 Akira TAGOH
*
* Authors:
* Akira TAGOH <akira@tagoh.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#if !defined (__HG_H_INSIDE__) && !defined (HG_COMPILATION)
#error "Only <hieroglyph/hg.h> can be included directly."
#endif
#ifndef __HIEROGLYPH_HGVM_H__
#define __HIEROGLYPH_HGVM_H__
#include <hieroglyph/hgtypes.h>
#include <hieroglyph/hgdevice.h>
#include <hieroglyph/hgerror.h>
#include <hieroglyph/hgfile.h>
#include <hieroglyph/hglineedit.h>
#include <hieroglyph/hgscanner.h>
#include <hieroglyph/hgstack.h>
HG_BEGIN_DECLS
#define HG_VM_LOCK(_v_,_q_) \
(hg_vm_quark_lock_object((_v_),(_q_),__PRETTY_FUNCTION__))
#define HG_VM_UNLOCK(_v_,_q_) \
(hg_vm_quark_unlock_object((_v_),(_q_)))
typedef enum _hg_vm_mem_type_t hg_vm_mem_type_t;
typedef struct _hg_vm_state_t hg_vm_state_t;
typedef enum _hg_vm_langlevel_t hg_vm_langlevel_t;
typedef enum _hg_vm_trans_flags_t hg_vm_trans_flags_t;
typedef struct _hg_vm_user_params_t hg_vm_user_params_t;
typedef struct _hg_vm_sys_params_t hg_vm_sys_params_t;
typedef struct _hg_vm_value_t hg_vm_value_t;
typedef enum _hg_vm_stack_type_t hg_vm_stack_type_t;
typedef enum _hg_vm_user_params_name_t hg_vm_user_params_name_t;
typedef enum _hg_vm_sys_params_name_t hg_vm_sys_params_name_t;
enum _hg_vm_stack_type_t {
HG_VM_STACK_OSTACK = 0,
HG_VM_STACK_ESTACK,
HG_VM_STACK_DSTACK,
HG_VM_STACK_GSTATE,
HG_VM_STACK_END
};
enum _hg_vm_user_params_name_t {
HG_VM_user_BEGIN = 0,
HG_VM_user_MaxOpStack,
HG_VM_user_MaxExecStack,
HG_VM_user_MaxDictStack,
HG_VM_user_MaxGStateStack,
HG_VM_user_END
};
enum _hg_vm_sys_params_name_t {
HG_VM_sys_BEGIN = 0,
HG_VM_sys_END
};
enum _hg_vm_mem_type_t {
HG_VM_MEM_GLOBAL = 0,
HG_VM_MEM_LOCAL = 1,
HG_VM_MEM_END
};
enum _hg_vm_langlevel_t {
HG_LANG_LEVEL_1 = 0,
HG_LANG_LEVEL_2,
HG_LANG_LEVEL_3,
HG_LANG_LEVEL_END
};
enum _hg_vm_trans_flags_t {
HG_TRANS_FLAG_NONE = 0,
HG_TRANS_FLAG_TOKEN = (1 << 0),
HG_TRANS_FLAG_BLOCK = (1 << 1), /* For internal */
HG_TRANS_FLAG_END
};
struct _hg_vm_user_params_t {
hg_usize_t max_op_stack;
hg_usize_t max_exec_stack;
hg_usize_t max_dict_stack;
hg_usize_t max_gstate_stack;
};
struct _hg_vm_sys_params_t {
};
struct _hg_vm_state_t {
hg_quark_t self;
hg_vm_mem_type_t current_mem_index;
hg_int_t n_save_objects;
};
struct _hg_vm_t {
hg_quark_t self;
hg_vm_state_t *vm_state;
hg_vm_user_params_t user_params;
hg_mem_t *mem[HG_VM_MEM_END];
hg_int_t mem_id[HG_VM_MEM_END];
hg_quark_t qio[HG_FILE_IO_END];
hg_stack_spool_t *stack_spooler;
hg_stack_t *stacks[HG_VM_STACK_END];
GPtrArray *stacks_stack;
hg_quark_t qerror_name[HG_e_END];
hg_quark_t quparams_name[HG_VM_user_END];
hg_quark_t qsparams_name[HG_VM_sys_END];
hg_quark_t qpdevparams_name[HG_pdev_END];
hg_quark_t qerror;
hg_quark_t qsystemdict;
hg_quark_t qglobaldict;
hg_quark_t qinternaldict;
hg_quark_t qgstate;
hg_scanner_t *scanner;
hg_lineedit_t *lineedit;
hg_vm_langlevel_t language_level;
hg_bool_t is_initialized:1;
hg_bool_t hold_lang_level:1;
hg_bool_t shutdown:1;
hg_bool_t has_error:1;
hg_int_t error_code;
hg_uint_t n_nest_scan;
hg_quark_acl_t default_acl;
GHashTable *params;
GHashTable *plugin_table;
GList *plugin_list;
GRand *rand_;
hg_uint_t rand_seed;
GTimeVal initiation_time;
hg_device_t *device;
};
struct _hg_vm_value_t {
hg_int_t type;
union {
hg_bool_t bool;
hg_int_t integer;
hg_real_t real;
hg_char_t *string;
} u;
};
/* hg_vm_t */
hg_bool_t hg_vm_init (void);
void hg_vm_tini (void);
hg_vm_t *hg_vm_new (void);
void hg_vm_destroy (hg_vm_t *vm);
hg_quark_t hg_vm_malloc (hg_vm_t *vm,
hg_usize_t size,
hg_pointer_t *ret);
hg_quark_t hg_vm_realloc (hg_vm_t *vm,
hg_quark_t qdata,
hg_usize_t size,
hg_pointer_t *ret);
void hg_vm_set_default_acl (hg_vm_t *vm,
hg_quark_acl_t acl);
hg_mem_t *hg_vm_get_mem (hg_vm_t *vm);
void hg_vm_use_global_mem (hg_vm_t *vm,
hg_bool_t flag);
hg_bool_t hg_vm_is_global_mem_used (hg_vm_t *vm);
hg_quark_t hg_vm_get_io (hg_vm_t *vm,
hg_file_io_t type);
void hg_vm_set_io (hg_vm_t *vm,
hg_file_io_t type,
hg_quark_t file);
hg_bool_t hg_vm_setup (hg_vm_t *vm,
hg_vm_langlevel_t lang_level,
hg_quark_t stdin,
hg_quark_t stdout,
hg_quark_t stderr);
void hg_vm_finish (hg_vm_t *vm);
hg_vm_langlevel_t hg_vm_get_language_level (hg_vm_t *vm);
hg_bool_t hg_vm_set_language_level (hg_vm_t *vm,
hg_vm_langlevel_t level);
void hg_vm_hold_language_level(hg_vm_t *vm,
hg_bool_t flag);
hg_bool_t hg_vm_translate (hg_vm_t *vm,
hg_vm_trans_flags_t flags);
hg_bool_t hg_vm_main_loop (hg_vm_t *vm);
hg_bool_t hg_vm_eval (hg_vm_t *vm,
hg_quark_t qeval,
hg_stack_t *ostack,
hg_stack_t *estack,
hg_stack_t *dstack,
hg_bool_t protect_systemdict);
hg_bool_t hg_vm_eval_from_cstring (hg_vm_t *vm,
const hg_char_t *cstring,
hg_size_t clen,
hg_stack_t *ostack,
hg_stack_t *estack,
hg_stack_t *dstack,
hg_bool_t protect_systemdict);
hg_bool_t hg_vm_eval_from_file (hg_vm_t *vm,
const hg_char_t *initfile,
hg_stack_t *ostack,
hg_stack_t *estack,
hg_stack_t *dstack,
hg_bool_t protect_systemdict);
hg_int_t hg_vm_get_error_code (hg_vm_t *vm);
void hg_vm_set_error_code (hg_vm_t *vm,
hg_int_t error_code);
hg_bool_t hg_vm_startjob (hg_vm_t *vm,
hg_vm_langlevel_t lang_level,
const hg_char_t *initfile,
hg_bool_t encapsulated);
void hg_vm_shutdown (hg_vm_t *vm,
hg_int_t error_code);
hg_bool_t hg_vm_is_finished (hg_vm_t *vm);
hg_quark_t hg_vm_get_gstate (hg_vm_t *vm);
void hg_vm_set_gstate (hg_vm_t *vm,
hg_quark_t qgstate);
hg_quark_t hg_vm_get_user_params (hg_vm_t *vm,
hg_pointer_t *ret);
hg_bool_t hg_vm_set_user_params (hg_vm_t *vm,
hg_quark_t qdict);
void hg_vm_set_rand_seed (hg_vm_t *vm,
hg_uint_t seed);
hg_uint_t hg_vm_get_rand_seed (hg_vm_t *vm);
hg_uint_t hg_vm_rand_int (hg_vm_t *vm);
hg_uint_t hg_vm_get_current_time (hg_vm_t *vm);
hg_bool_t hg_vm_has_error (hg_vm_t *vm);
void hg_vm_clear_error (hg_vm_t *vm);
void hg_vm_reset_error (hg_vm_t *vm);
#if 0
hg_bool_t hg_vm_set_error (hg_vm_t *vm,
hg_quark_t qdata,
hg_error_reason_t error);
hg_bool_t hg_vm_set_error0 (hg_vm_t *vm,
hg_quark_t qdata);
#endif
void hg_vm_reserved_spool_dump(hg_vm_t *vm,
hg_mem_t *mem,
hg_file_t *ofile);
hg_bool_t hg_vm_add_plugin (hg_vm_t *vm,
const hg_char_t *name);
void hg_vm_load_plugins (hg_vm_t *vm);
hg_bool_t hg_vm_remove_plugin (hg_vm_t *vm,
const hg_char_t *name);
void hg_vm_unload_plugins (hg_vm_t *vm);
hg_bool_t hg_vm_set_device (hg_vm_t *vm,
const hg_char_t *name);
void hg_vm_add_param (hg_vm_t *vm,
const hg_char_t *name,
hg_vm_value_t *value);
/* hg_array_t */
hg_bool_t hg_vm_array_set(hg_vm_t *vm,
hg_quark_t qarray,
hg_quark_t qdata,
hg_usize_t index,
hg_bool_t force);
hg_quark_t hg_vm_array_get(hg_vm_t *vm,
hg_quark_t qarray,
hg_usize_t index,
hg_bool_t force);
/* hg_dict_t */
hg_quark_t hg_vm_dstack_lookup (hg_vm_t *vm,
hg_quark_t qname);
hg_bool_t hg_vm_dstack_remove (hg_vm_t *vm,
hg_quark_t qname,
hg_bool_t remove_all);
hg_quark_t hg_vm_dstack_get_dict(hg_vm_t *vm);
hg_bool_t hg_vm_dict_add (hg_vm_t *vm,
hg_quark_t qdict,
hg_quark_t qkey,
hg_quark_t qval,
hg_bool_t force);
hg_bool_t hg_vm_dict_remove (hg_vm_t *vm,
hg_quark_t qdict,
hg_quark_t qkey);
hg_quark_t hg_vm_dict_lookup (hg_vm_t *vm,
hg_quark_t qdict,
hg_quark_t qkey,
hg_bool_t check_perms);
/* hg_quark_t */
hg_mem_t *hg_vm_quark_get_mem (hg_vm_t *vm,
hg_quark_t qdata);
hg_pointer_t hg_vm_quark_lock_object (hg_vm_t *vm,
hg_quark_t qdata,
const hg_char_t *pretty_function);
void hg_vm_quark_unlock_object (hg_vm_t *vm,
hg_quark_t qdata);
hg_bool_t hg_vm_quark_gc_mark (hg_vm_t *vm,
hg_quark_t qdata);
hg_quark_t hg_vm_quark_copy (hg_vm_t *vm,
hg_quark_t qdata,
hg_pointer_t *ret);
hg_quark_t hg_vm_quark_to_string (hg_vm_t *vm,
hg_quark_t qdata,
hg_bool_t ps_like_syntax,
hg_pointer_t *ret);
hg_bool_t hg_vm_quark_compare (hg_vm_t *vm,
hg_quark_t qdata1,
hg_quark_t qdata2);
hg_bool_t hg_vm_quark_compare_content(hg_vm_t *vm,
hg_quark_t qdata1,
hg_quark_t qdata2);
void hg_vm_quark_set_default_acl(hg_vm_t *vm,
hg_quark_t *qdata);
void hg_vm_quark_set_acl (hg_vm_t *vm,
hg_quark_t *qdata,
hg_quark_acl_t acl);
void hg_vm_quark_set_readable (hg_vm_t *vm,
hg_quark_t *qdata,
hg_bool_t flag);
hg_bool_t hg_vm_quark_is_readable (hg_vm_t *vm,
hg_quark_t *qdata);
void hg_vm_quark_set_writable (hg_vm_t *vm,
hg_quark_t *qdata,
hg_bool_t flag);
hg_bool_t hg_vm_quark_is_writable (hg_vm_t *vm,
hg_quark_t *qdata);
void hg_vm_quark_set_executable (hg_vm_t *vm,
hg_quark_t *qdata,
hg_bool_t flag);
hg_bool_t hg_vm_quark_is_executable (hg_vm_t *vm,
hg_quark_t *qdata);
void hg_vm_quark_set_accessible (hg_vm_t *vm,
hg_quark_t *qdata,
hg_bool_t flag);
hg_bool_t hg_vm_quark_is_accessible (hg_vm_t *vm,
hg_quark_t *qdata);
/* hg_snapshot_t */
hg_error_t hg_vm_snapshot_save (hg_vm_t *vm);
hg_error_t hg_vm_snapshot_restore(hg_vm_t *vm,
hg_quark_t qsnapshot);
/* hg_stack_t */
hg_stack_t *hg_vm_stack_new (hg_vm_t *vm,
hg_usize_t size);
void hg_vm_stack_dump(hg_vm_t *vm,
hg_stack_t *stack,
hg_file_t *output);
/* hg_string_t */
hg_char_t *hg_vm_string_get_cstr(hg_vm_t *vm,
hg_quark_t qstring);
hg_uint_t hg_vm_string_length (hg_vm_t *vm,
hg_quark_t qstring);
/* hg_vm_value_t */
void hg_vm_value_free (hg_pointer_t data);
hg_vm_value_t *hg_vm_value_boolean_new(hg_bool_t value);
hg_vm_value_t *hg_vm_value_integer_new(hg_int_t value);
hg_vm_value_t *hg_vm_value_real_new (hg_real_t value);
hg_vm_value_t *hg_vm_value_string_new (const hg_char_t *value);
HG_END_DECLS
#endif /* __HIEROGLYPH_HGVM_H__ */
|