1
1
#define snippet_init_dll
2
- // / snippet_init_dll()
2
+ // / snippet_init_dll(?path_prefix )
3
3
var _path, _dir;
4
+ if (argument_count > 0 ) {
5
+ _dir = argument[0 ];
6
+ } else _dir = " " ;
4
7
5
- _dir = " " ;
6
8
_path = _dir + " snippets.dll" ;
7
9
global.f_snippet_event_get_type = external_define(_path, " snippet_event_get_type" , dll_cdecl, ty_real, 1 , ty_string);
8
10
global.f_snippet_event_get_number = external_define(_path, " snippet_event_get_number" , dll_cdecl, ty_real, 1 , ty_string);
@@ -14,6 +16,7 @@ global.f_snippet_function_add = external_define(_path, "snippet_function_add", d
14
16
global.f_snippet_function_remove = external_define(_path, " snippet_function_remove" , dll_cdecl, ty_real, 1 , ty_string);
15
17
global.f_snippet_parse_api_entry = external_define(_path, " snippet_parse_api_entry" , dll_cdecl, ty_real, 1 , ty_string);
16
18
global.f_snippet_parse_api_file = external_define(_path, " snippet_parse_api_file" , dll_cdecl, ty_real, 1 , ty_string);
19
+ global.f_sniptools_file_exists = external_define(_path, " sniptools_file_exists" , dll_cdecl, ty_real, 1 , ty_string);
17
20
global.f_sniptools_file_get_contents = external_define(_path, " sniptools_file_get_contents" , dll_cdecl, ty_string, 1 , ty_string);
18
21
global.f_sniptools_string_trim = external_define(_path, " sniptools_string_trim" , dll_cdecl, ty_string, 1 , ty_string);
19
22
global.f_sniptools_string_trim_start = external_define(_path, " sniptools_string_trim_start" , dll_cdecl, ty_string, 1 , ty_string);
@@ -28,7 +31,14 @@ global.f_snippet_preproc_concat_names = external_define(_path, "snippet_preproc_
28
31
29
32
30
33
#define snippet_init
31
- // / ()
34
+ // / (?path_prefix)
35
+ var _dir, _dir_auto;
36
+ _dir_auto = argument_count == 0 ;
37
+ if (_dir_auto) {
38
+ _dir = " " ;
39
+ } else {
40
+ _dir = argument[0 ];
41
+ }
32
42
snippet_init_dll ();
33
43
var i; i = 0 ;
34
44
global.__snippet__argument[0 ] = 0 ;
@@ -52,8 +62,15 @@ for (i = 0; i < global.__snippet__blank_object; i += 1) if (object_exists(i)) {
52
62
// contains things like "create\nstep" in case we need to delete events later
53
63
global.__snippet__object_events = ds_map_create();
54
64
55
- snippet_parse_api_file (" fnames" );
56
- snippet_parse_event_file (" events.gml" );
65
+ if (_dir == " " || filename_drive(_dir) == " " ) { // relative path?
66
+ if (sniptools_file_exists (program_directory + _dir + " \f names" )) {
67
+ _dir = program_directory + _dir + " \" ;
68
+ } else if (sniptools_file_exists(working_directory + _dir + " \fnames" )) {
69
+ _dir = working_directory + _dir + " \" ;
70
+ }
71
+ }
72
+ snippet_parse_api_file(_dir + " fnames" );
73
+ snippet_parse_event_file(_dir + " events.gml " );
57
74
58
75
// collect scripts:
59
76
var _max_gap; _max_gap = 1024;
@@ -77,14 +94,58 @@ while (_gap < _max_gap || !_seen_snippet_init) {
77
94
);*/
78
95
79
96
#define snippet_execute_string
80
- // / (gml_code)
81
- var n; n = external_call(global.f_snippet_preproc_run, " " , argument0, " define" );
97
+ /// (gml_code, ...arguments)
98
+ var n; n = external_call(global.f_snippet_preproc_run, " " , argument[0], " define" );
99
+
100
+ // NB! Store-restore mirrors across snippet_execute_string, snippet_call, snippet_call_ext
101
+ // store old arguments:
102
+ var _old_argc; _old_argc = global.__snippet__argument_count;
103
+ var _old_args; _old_args = global.__snippet__argument;
104
+ var i; i = 1;
105
+ repeat (_old_argc - 1) {
106
+ _old_args[i] = global.__snippet__argument[i];
107
+ i += 1;
108
+ }
109
+
110
+ // copy new arguments:
111
+ var _argc; _argc = argument_count - 1;
112
+ global.__snippet__argument_count = _argc;
113
+ i = 0;
114
+ repeat (_argc) {
115
+ global.__snippet__argument[i] = argument[i + 1];
116
+ i += 1;
117
+ }
118
+
119
+ // clear " extra" arguments:
120
+ repeat (_old_argc - _argc) {
121
+ global.__snippet__argument[i] = 0;
122
+ i += 1;
123
+ }
124
+
125
+ // run the snippet(s):
82
126
var _result; _result = 0;
83
127
repeat (n) {
84
128
var _name; _name = external_call(global.f_snippet_preproc_pop_name);
85
129
var _code; _code = external_call(global.f_snippet_preproc_pop_code);
86
- _result = execute_string (_code);
130
+ global.__snippet__result = 0;
131
+ execute_string(_code);
132
+ _result = global.__snippet__result;
133
+ }
134
+
135
+ // restore previous arguments:
136
+ global.__snippet__argument_count = _old_argc;
137
+ i = 0;
138
+ repeat (_old_argc) {
139
+ global.__snippet__argument[i] = _old_args[i];
140
+ i += 1;
87
141
}
142
+
143
+ // clear the extra arguments (the other way around!):
144
+ repeat (_argc - _old_argc) {
145
+ global.__snippet__argument[i] = 0;
146
+ i += 1;
147
+ }
148
+
88
149
return _result;
89
150
90
151
#define snippet_define
@@ -142,9 +203,10 @@ if (ds_map_exists(global.__snippet__code_map, argument0)) {
142
203
} else return " " ;
143
204
144
205
#define snippet_call
145
- // / (name, ...args )
146
- var _name; _name = argument0 ;
206
+ /// (name, ...arguments )
207
+ var _name; _name = argument[0] ;
147
208
209
+ // NB! Store-restore mirrors across snippet_execute_string, snippet_call, snippet_call_ext
148
210
// store old arguments:
149
211
var _old_argc; _old_argc = global.__snippet__argument_count;
150
212
var _old_args; _old_args = global.__snippet__argument;
@@ -170,6 +232,74 @@ repeat (_old_argc - _argc) {
170
232
}
171
233
172
234
if (ds_map_exists(global.__snippet__map, _name)) {
235
+ global.__snippet__result = 0;
236
+ // one snippet per event:
237
+ var _enumb; _enumb = ds_map_find_value(global.__snippet__map, _name);
238
+ event_perform_object(obj_snippets, ev_alarm, _enumb);
239
+ //*/
240
+
241
+ /* one snippet per object:
242
+ var _obj; _obj = ds_map_find_value(global.__snippet__map, _name);
243
+ event_perform_object(_obj, ev_other, 257);
244
+ //*/
245
+ } else {
246
+ show_error('Snippet " ' + _name + ' " does not exist!', true);
247
+ }
248
+
249
+ // restore previous arguments:
250
+ global.__snippet__argument_count = _old_argc;
251
+ i = 0;
252
+ repeat (_old_argc) {
253
+ global.__snippet__argument[i] = _old_args[i];
254
+ i += 1;
255
+ }
256
+
257
+ // clear the extra arguments (the other way around!):
258
+ repeat (_argc - _old_argc) {
259
+ global.__snippet__argument[i] = 0;
260
+ i += 1;
261
+ }
262
+
263
+ return global.__snippet__result;
264
+
265
+ #define snippet_call_ext
266
+ /// (name, argument_list, offset=0, ?count)
267
+ var _name; _name = argument[0];
268
+ var _args; _args = argument[1];
269
+ var _argi, _argc;
270
+ if (argument_count > 2) {
271
+ _argi = argument[2];
272
+ } else _argi = 0;
273
+ if (argument_count > 3) {
274
+ _argc = argument[3];
275
+ } else _argc = ds_list_size(_args) - _argi;
276
+
277
+ // NB! Store-restore mirrors across snippet_execute_string, snippet_call, snippet_call_ext
278
+ // store old arguments:
279
+ var _old_argc; _old_argc = global.__snippet__argument_count;
280
+ var _old_args; _old_args = global.__snippet__argument;
281
+ var i; i = 1;
282
+ repeat (_old_argc - 1) {
283
+ _old_args[i] = global.__snippet__argument[i];
284
+ i += 1;
285
+ }
286
+
287
+ // copy new arguments:
288
+ global.__snippet__argument_count = _argc;
289
+ i = 0;
290
+ repeat (_argc) {
291
+ global.__snippet__argument[i] = ds_list_find_value(_args, _argi + i);
292
+ i += 1;
293
+ }
294
+
295
+ // clear " extra" arguments:
296
+ repeat (_old_argc - _argc) {
297
+ global.__snippet__argument[i] = 0;
298
+ i += 1;
299
+ }
300
+
301
+ if (ds_map_exists(global.__snippet__map, _name)) {
302
+ global.__snippet__result = 0;
173
303
// one snippet per event:
174
304
var _enumb; _enumb = ds_map_find_value(global.__snippet__map, _name);
175
305
event_perform_object(obj_snippets, ev_alarm, _enumb);
@@ -489,6 +619,10 @@ return external_call(global.f_snippet_parse_api_entry, argument0);
489
619
/// snippet_parse_api_file(path)
490
620
return external_call(global.f_snippet_parse_api_file, argument0);
491
621
622
+ #define sniptools_file_exists
623
+ /// sniptools_file_exists(path)
624
+ return external_call(global.f_sniptools_file_exists, argument0);
625
+
492
626
#define sniptools_file_get_contents
493
627
/// sniptools_file_get_contents(path)
494
628
return external_call(global.f_sniptools_file_get_contents, argument0);
0 commit comments