cmdコマンド追加
@@ -6,7 +6,7 @@ | ||
6 | 6 | sm.o uniface.o iptr.o file.o iface.o \ |
7 | 7 | listener.o args.o struct.o \ |
8 | 8 | cmd.o console.o state_event.o cmd_event.o istate.o \ |
9 | -vt.o cbuf.o stack.o vstack.o source.o | |
9 | +vt.o cbuf.o stack.o vstack.o source.o cmdi.o | |
10 | 10 | ar rcs libnpl.a npl.o object.o stream.o str.o \ |
11 | 11 | mbstr.o type.o sbuf.o buf.o \ |
12 | 12 | chunk.o val.o var.o tuple.o \ |
@@ -15,7 +15,8 @@ | ||
15 | 15 | sm.o uniface.o iptr.o file.o iface.o \ |
16 | 16 | listener.o args.o struct.o \ |
17 | 17 | cmd.o console.o state_event.o cmd_event.o \ |
18 | - istate.o vt.o cbuf.o stack.o vstack.o source.o | |
18 | + istate.o vt.o cbuf.o stack.o vstack.o source.o \ | |
19 | + cmdi.o | |
19 | 20 | |
20 | 21 | npl.o: npl.c npl.h |
21 | 22 | gcc -Wall -c npl.c |
@@ -122,6 +123,9 @@ | ||
122 | 123 | source.o: source.c npl.h |
123 | 124 | gcc -Wall -c source.c |
124 | 125 | |
126 | +cmdi.o: cmdi.c npl.h | |
127 | + gcc -Wall -c cmdi.c | |
128 | + | |
125 | 129 | clean: |
126 | 130 | rm -f *.o |
127 | 131 | rm -f libnpl.a |
@@ -7,8 +7,8 @@ | ||
7 | 7 | // 引数配列をクリアする |
8 | 8 | static void _reset_args(npl_cmd_t *cmd) |
9 | 9 | { |
10 | - npl_cbuf_clear(&cmd->_argv); | |
11 | - cmd->argc = 0; | |
10 | + npl_cbuf_clear(&cmd->ci->_argv); | |
11 | + cmd->ci->argc = 0; | |
12 | 12 | } |
13 | 13 | |
14 | 14 | // 引数配列に1つ追加する |
@@ -17,15 +17,15 @@ | ||
17 | 17 | wchar_t **v; |
18 | 18 | size_t new_argc; |
19 | 19 | |
20 | - if (npl_add(cmd->argc, 1, &new_argc)) | |
20 | + if (npl_add(cmd->ci->argc, 1, &new_argc)) | |
21 | 21 | return 1; // error |
22 | - if (npl_cbuf_len(&cmd->_argv) == cmd->argc) | |
23 | - if (npl_cbuf_expand(&cmd->_argv, 16)) | |
22 | + if (npl_cbuf_len(&cmd->ci->_argv) == cmd->ci->argc) | |
23 | + if (npl_cbuf_expand(&cmd->ci->_argv, 16)) | |
24 | 24 | return 1; // error |
25 | 25 | |
26 | - v = npl_cbuf_get_buffer(&cmd->_argv); | |
27 | - v[cmd->argc] = ws; | |
28 | - cmd->argc = new_argc; | |
26 | + v = npl_cbuf_get_buffer(&cmd->ci->_argv); | |
27 | + v[cmd->ci->argc] = ws; | |
28 | + cmd->ci->argc = new_argc; | |
29 | 29 | return 0; |
30 | 30 | } |
31 | 31 |
@@ -37,7 +37,7 @@ | ||
37 | 37 | npl_str_t *s; |
38 | 38 | |
39 | 39 | if (NPL_wcscmp(L"_", &str[1]) == 0) |
40 | - var = cmd->result; | |
40 | + var = cmd->ci->result; | |
41 | 41 | else |
42 | 42 | var = npl_cmd_get_var(cmd, &str[1]); |
43 | 43 |
@@ -63,27 +63,27 @@ | ||
63 | 63 | wchar_t **argv, *str; |
64 | 64 | size_t argc; |
65 | 65 | |
66 | - cmd_buf = &cmd->_cmd_buf; | |
66 | + cmd_buf = &cmd->ci->_cmd_buf; | |
67 | 67 | |
68 | 68 | // 文字の切り出し |
69 | - for (; ; cmd->src.buf++) { | |
70 | - if (*cmd->src.buf == L'\0') { | |
71 | - npl_source_done(&cmd->src); | |
69 | + for (; ; cmd->ci->src.buf++) { | |
70 | + if (*cmd->ci->src.buf == L'\0') { | |
71 | + npl_source_done(&cmd->ci->src); | |
72 | 72 | break; |
73 | 73 | } |
74 | - if (*cmd->src.buf == L'\n') { | |
75 | - cmd->f_lf = 1; | |
76 | - cmd->src.buf++; | |
74 | + if (*cmd->ci->src.buf == L'\n') { | |
75 | + cmd->ci->lf = 1; | |
76 | + cmd->ci->src.buf++; | |
77 | 77 | if (npl_sbuf_put(cmd_buf, L'\0')) |
78 | 78 | goto ERROR; |
79 | - if (*cmd->src.buf == L'\0') | |
80 | - npl_source_done(&cmd->src); | |
79 | + if (*cmd->ci->src.buf == L'\0') | |
80 | + npl_source_done(&cmd->ci->src); | |
81 | 81 | break; |
82 | 82 | } |
83 | - if (cmd->f_comment) | |
83 | + if (cmd->ci->comment) | |
84 | 84 | continue; |
85 | - if (cmd->f_es) { | |
86 | - switch (*cmd->src.buf) { | |
85 | + if (cmd->ci->es) { | |
86 | + switch (*cmd->ci->src.buf) { | |
87 | 87 | case L's': |
88 | 88 | if (npl_sbuf_put(cmd_buf, L' ')) |
89 | 89 | goto ERROR; |
@@ -111,44 +111,44 @@ | ||
111 | 111 | default: |
112 | 112 | goto ERROR; |
113 | 113 | } |
114 | - cmd->f_es = 0; | |
114 | + cmd->ci->es = 0; | |
115 | 115 | continue; |
116 | 116 | } |
117 | - if (cmd->f_sq) { | |
118 | - switch (*cmd->src.buf) { | |
117 | + if (cmd->ci->sq) { | |
118 | + switch (*cmd->ci->src.buf) { | |
119 | 119 | case L'\'': |
120 | 120 | if (npl_sbuf_put(cmd_buf, L'\0')) |
121 | 121 | goto ERROR; |
122 | - cmd->f_sq = 0; | |
122 | + cmd->ci->sq = 0; | |
123 | 123 | break; |
124 | 124 | case L'\\': |
125 | - cmd->f_es = 1; | |
125 | + cmd->ci->es = 1; | |
126 | 126 | break; |
127 | 127 | default: |
128 | - if (npl_sbuf_put(cmd_buf, *cmd->src.buf)) | |
128 | + if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf)) | |
129 | 129 | goto ERROR; |
130 | 130 | break; |
131 | 131 | } |
132 | 132 | continue; |
133 | 133 | } |
134 | - if (cmd->f_dq) { | |
135 | - switch (*cmd->src.buf) { | |
134 | + if (cmd->ci->dq) { | |
135 | + switch (*cmd->ci->src.buf) { | |
136 | 136 | case L'"': |
137 | 137 | if (npl_sbuf_put(cmd_buf, L'\0')) |
138 | 138 | goto ERROR; |
139 | - cmd->f_dq = 0; | |
139 | + cmd->ci->dq = 0; | |
140 | 140 | break; |
141 | 141 | case L'\\': |
142 | - cmd->f_es = 1; | |
142 | + cmd->ci->es = 1; | |
143 | 143 | break; |
144 | 144 | default: |
145 | - if (npl_sbuf_put(cmd_buf, *cmd->src.buf)) | |
145 | + if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf)) | |
146 | 146 | goto ERROR; |
147 | 147 | break; |
148 | 148 | } |
149 | 149 | continue; |
150 | 150 | } |
151 | - switch (*cmd->src.buf) { | |
151 | + switch (*cmd->ci->src.buf) { | |
152 | 152 | case L' ': |
153 | 153 | case L'\t': |
154 | 154 | if (npl_sbuf_put(cmd_buf, L'\0')) |
@@ -155,10 +155,10 @@ | ||
155 | 155 | goto ERROR; |
156 | 156 | break; |
157 | 157 | case L'#': |
158 | - cmd->f_comment = 1; | |
158 | + cmd->ci->comment = 1; | |
159 | 159 | break; |
160 | 160 | case L'\'': |
161 | - cmd->f_sq = 1; | |
161 | + cmd->ci->sq = 1; | |
162 | 162 | if (npl_sbuf_put(cmd_buf, L'\0')) |
163 | 163 | goto ERROR; |
164 | 164 | if (npl_sbuf_put(cmd_buf, L'\'')) |
@@ -165,7 +165,7 @@ | ||
165 | 165 | goto ERROR; |
166 | 166 | break; |
167 | 167 | case L'"': |
168 | - cmd->f_dq = 1; | |
168 | + cmd->ci->dq = 1; | |
169 | 169 | if (npl_sbuf_put(cmd_buf, L'\0')) |
170 | 170 | goto ERROR; |
171 | 171 | if (npl_sbuf_put(cmd_buf, L'"')) |
@@ -172,12 +172,12 @@ | ||
172 | 172 | goto ERROR; |
173 | 173 | break; |
174 | 174 | default: |
175 | - if (npl_sbuf_put(cmd_buf, *cmd->src.buf)) | |
175 | + if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf)) | |
176 | 176 | goto ERROR; |
177 | 177 | break; |
178 | 178 | } |
179 | 179 | } |
180 | - if (cmd->f_lf == 0) | |
180 | + if (cmd->ci->lf == 0) | |
181 | 181 | return 1; // コマンド入力中 |
182 | 182 | |
183 | 183 | // コマンドライン引数配列を作る |
@@ -196,11 +196,11 @@ | ||
196 | 196 | } |
197 | 197 | if (_add_arg(cmd, NULL)) |
198 | 198 | goto ERROR; |
199 | - cmd->argc -= 1; | |
199 | + cmd->ci->argc -= 1; | |
200 | 200 | |
201 | 201 | // コマンドライン引数の変換処理 |
202 | - argc = cmd->argc; | |
203 | - argv = npl_cbuf_get(&cmd->_argv, 0); | |
202 | + argc = cmd->ci->argc; | |
203 | + argv = npl_cbuf_get(&cmd->ci->_argv, 0); | |
204 | 204 | for (i=1; i<argc; i++) { |
205 | 205 | str = argv[i]; |
206 | 206 | switch (str[0]) { |
@@ -213,7 +213,7 @@ | ||
213 | 213 | break; |
214 | 214 | } |
215 | 215 | } |
216 | - cmd->argv = argv; | |
216 | + cmd->ci->argv = argv; | |
217 | 217 | |
218 | 218 | return 0; // コマンド入力完了 |
219 | 219 |
@@ -227,12 +227,12 @@ | ||
227 | 227 | npl_command_list_t **list = cmd->commands; |
228 | 228 | npl_command_list_t *cl; |
229 | 229 | size_t i, j; |
230 | - wchar_t **v = npl_cbuf_get(&cmd->_argv, 0); | |
230 | + wchar_t **v = npl_cbuf_get(&cmd->ci->_argv, 0); | |
231 | 231 | wchar_t *name; |
232 | 232 | |
233 | 233 | if (list == NULL) |
234 | 234 | return 0; |
235 | - if (cmd->argc == 0) | |
235 | + if (cmd->ci->argc == 0) | |
236 | 236 | return 0; |
237 | 237 | name = v[0]; |
238 | 238 | for (i=0; i<cmd->_commands_len; i++) { |
@@ -243,7 +243,10 @@ | ||
243 | 243 | while (cl[j].name != NULL) { |
244 | 244 | if (NPL_wcscmp(cl[j].name, name) == 0) { |
245 | 245 | if (cl[j].func != NULL) |
246 | - return cl[j].func(cmd, cmd->argc, v); | |
246 | + return cl[j].func( | |
247 | + cmd, | |
248 | + cmd->ci->argc, | |
249 | + v); | |
247 | 250 | } |
248 | 251 | j++; |
249 | 252 | } |
@@ -265,17 +268,17 @@ | ||
265 | 268 | switch (status) { |
266 | 269 | case 0: |
267 | 270 | // コマンド行入力完了 |
268 | - if (cmd->dmf_dump_argv) | |
271 | + if (cmd->f_dump_argv) | |
269 | 272 | npl_cmd_dump_argv(cmd); |
270 | 273 | if (_cmd_run(cmd)) |
271 | 274 | npl_cmd_failed(cmd); |
272 | 275 | |
273 | 276 | // 状態リセット |
274 | - npl_sbuf_clear(&cmd->_cmd_buf); | |
275 | - cmd->f_lf = 0; | |
276 | - cmd->f_sq = cmd->f_dq = 0; | |
277 | - cmd->f_es = 0; | |
278 | - cmd->f_comment = 0; | |
277 | + npl_sbuf_clear(&cmd->ci->_cmd_buf); | |
278 | + cmd->ci->lf = 0; | |
279 | + cmd->ci->sq = cmd->ci->dq = 0; | |
280 | + cmd->ci->es = 0; | |
281 | + cmd->ci->comment = 0; | |
279 | 282 | break; |
280 | 283 | case 1: |
281 | 284 | // コマンド行入力中 |
@@ -294,18 +297,6 @@ | ||
294 | 297 | if (npl_state_init(&cmd->state)) |
295 | 298 | return 1; // error |
296 | 299 | cmd->state.istate.istate_do = _istate_do; |
297 | - | |
298 | - if (npl_cbuf_init(&cmd->_argv, sizeof(wchar_t*), 32)) | |
299 | - return 1; // error | |
300 | - if (npl_sbuf_init(&cmd->_cmd_buf)) | |
301 | - return 1; // error | |
302 | - if (npl_source_init(&cmd->src)) | |
303 | - return 1; // error | |
304 | - cmd->result = npl_var_new(L"_"); | |
305 | - if (cmd->result == NULL) | |
306 | - return 1; // error | |
307 | - cmd->argc = 0; | |
308 | - cmd->argv = NULL; | |
309 | 300 | cmd->_commands_len = |
310 | 301 | sizeof(cmd->commands) / sizeof(npl_command_list_t*); |
311 | 302 |
@@ -349,6 +340,31 @@ | ||
349 | 340 | return NPL_STATE(cmd)->istate.running; |
350 | 341 | } |
351 | 342 | |
343 | +int npl_cmd_push_cmdi(npl_cmd_t *cmd, npl_cmdi_t *ci) | |
344 | +{ | |
345 | + NPL_assert(cmd); | |
346 | + NPL_assert(ci); | |
347 | + | |
348 | + NPL_memset(ci, 0, sizeof(npl_cmdi_t)); | |
349 | + if (npl_cmdi_init(ci)) | |
350 | + return 1; // error | |
351 | + ci->prev = cmd->ci; | |
352 | + cmd->ci = ci; | |
353 | + | |
354 | + return 0; | |
355 | +} | |
356 | + | |
357 | +void npl_cmd_pop_cmdi(npl_cmd_t *cmd) | |
358 | +{ | |
359 | + npl_cmdi_t *prev; | |
360 | + | |
361 | + NPL_assert(cmd); | |
362 | + | |
363 | + prev = cmd->ci->prev; | |
364 | + npl_cmdi_final(cmd->ci); | |
365 | + cmd->ci = prev; | |
366 | +} | |
367 | + | |
352 | 368 | int npl_cmd_do(npl_cmd_t *cmd) |
353 | 369 | { |
354 | 370 | NPL_assert(cmd); |
@@ -424,7 +440,7 @@ | ||
424 | 440 | { |
425 | 441 | NPL_assert(cmd); |
426 | 442 | |
427 | - if (npl_var_set_object(cmd->result, object)) { | |
443 | + if (npl_var_set_object(cmd->ci->result, object)) { | |
428 | 444 | npl_object_unref(object); |
429 | 445 | return 1; // error |
430 | 446 | } |
@@ -449,7 +465,7 @@ | ||
449 | 465 | { |
450 | 466 | NPL_assert(cmd); |
451 | 467 | |
452 | - if (npl_var_set_iface(cmd->result, iface)) { | |
468 | + if (npl_var_set_iface(cmd->ci->result, iface)) { | |
453 | 469 | npl_iface_unref(iface); |
454 | 470 | return 1; // error |
455 | 471 | } |
@@ -477,7 +493,7 @@ | ||
477 | 493 | { |
478 | 494 | NPL_assert(cmd); |
479 | 495 | |
480 | - if (npl_var_set_uniface(cmd->result, uniface)) { | |
496 | + if (npl_var_set_uniface(cmd->ci->result, uniface)) { | |
481 | 497 | npl_uniface_unref(uniface); |
482 | 498 | return 1; // error |
483 | 499 | } |
@@ -502,7 +518,7 @@ | ||
502 | 518 | { |
503 | 519 | NPL_assert(cmd); |
504 | 520 | |
505 | - if (npl_var_set_null(cmd->result)) | |
521 | + if (npl_var_set_null(cmd->ci->result)) | |
506 | 522 | return 1; // error |
507 | 523 | |
508 | 524 | if (name != NULL) { |
@@ -520,7 +536,7 @@ | ||
520 | 536 | { |
521 | 537 | NPL_assert(cmd); |
522 | 538 | |
523 | - if (npl_var_set_bool(cmd->result, b)) | |
539 | + if (npl_var_set_bool(cmd->ci->result, b)) | |
524 | 540 | return 1; // error |
525 | 541 | |
526 | 542 | if (name != NULL) { |
@@ -538,7 +554,7 @@ | ||
538 | 554 | { |
539 | 555 | NPL_assert(cmd); |
540 | 556 | |
541 | - if (npl_var_set_byte(cmd->result, byte)) | |
557 | + if (npl_var_set_byte(cmd->ci->result, byte)) | |
542 | 558 | return 1; // error |
543 | 559 | |
544 | 560 | if (name != NULL) { |
@@ -556,7 +572,7 @@ | ||
556 | 572 | { |
557 | 573 | NPL_assert(cmd); |
558 | 574 | |
559 | - if (npl_var_set_size(cmd->result, size)) | |
575 | + if (npl_var_set_size(cmd->ci->result, size)) | |
560 | 576 | return 1; // error |
561 | 577 | |
562 | 578 | if (name != NULL) { |
@@ -574,7 +590,7 @@ | ||
574 | 590 | { |
575 | 591 | NPL_assert(cmd); |
576 | 592 | |
577 | - if (npl_var_set_int(cmd->result, i)) | |
593 | + if (npl_var_set_int(cmd->ci->result, i)) | |
578 | 594 | return 1; // error |
579 | 595 | |
580 | 596 | if (name != NULL) { |
@@ -592,7 +608,7 @@ | ||
592 | 608 | { |
593 | 609 | NPL_assert(cmd); |
594 | 610 | |
595 | - if (npl_var_set_uint(cmd->result, u)) | |
611 | + if (npl_var_set_uint(cmd->ci->result, u)) | |
596 | 612 | return 1; // error |
597 | 613 | |
598 | 614 | if (name != NULL) { |
@@ -610,7 +626,7 @@ | ||
610 | 626 | { |
611 | 627 | NPL_assert(cmd); |
612 | 628 | |
613 | - if (npl_var_set_long(cmd->result, l)) | |
629 | + if (npl_var_set_long(cmd->ci->result, l)) | |
614 | 630 | return 1; // error |
615 | 631 | |
616 | 632 | if (name != NULL) { |
@@ -628,7 +644,7 @@ | ||
628 | 644 | { |
629 | 645 | NPL_assert(cmd); |
630 | 646 | |
631 | - if (npl_var_set_ulong(cmd->result, ul)) | |
647 | + if (npl_var_set_ulong(cmd->ci->result, ul)) | |
632 | 648 | return 1; // error |
633 | 649 | |
634 | 650 | if (name != NULL) { |
@@ -646,7 +662,7 @@ | ||
646 | 662 | { |
647 | 663 | NPL_assert(cmd); |
648 | 664 | |
649 | - if (npl_var_set_float(cmd->result, f)) | |
665 | + if (npl_var_set_float(cmd->ci->result, f)) | |
650 | 666 | return 1; // error |
651 | 667 | |
652 | 668 | if (name != NULL) { |
@@ -664,7 +680,7 @@ | ||
664 | 680 | { |
665 | 681 | NPL_assert(cmd); |
666 | 682 | |
667 | - if (npl_var_set_wchar(cmd->result, wc)) | |
683 | + if (npl_var_set_wchar(cmd->ci->result, wc)) | |
668 | 684 | return 1; // error |
669 | 685 | |
670 | 686 | if (name != NULL) { |
@@ -682,7 +698,7 @@ | ||
682 | 698 | { |
683 | 699 | NPL_assert(cmd); |
684 | 700 | |
685 | - if (npl_var_set_mbchar(cmd->result, mbc)) | |
701 | + if (npl_var_set_mbchar(cmd->ci->result, mbc)) | |
686 | 702 | return 1; // error |
687 | 703 | |
688 | 704 | if (name != NULL) { |
@@ -781,13 +797,8 @@ | ||
781 | 797 | { |
782 | 798 | npl_cmd_t *cmd = NPL_CMD(p); |
783 | 799 | |
784 | - npl_cbuf_final(&cmd->_argv); | |
785 | - npl_sbuf_final(&cmd->_cmd_buf); | |
786 | - npl_source_final(&cmd->src); | |
787 | - if (cmd->result != NULL) { | |
788 | - npl_object_unref(NPL_OBJECT(cmd->result)); | |
789 | - cmd->result = NULL; | |
790 | - } | |
800 | + while (cmd->ci != NULL) | |
801 | + npl_cmd_pop_cmdi(cmd); | |
791 | 802 | } |
792 | 803 | |
793 | 804 | npl_type_t _npl_cmd_type = { |
@@ -0,0 +1,34 @@ | ||
1 | +#include "npl.h" | |
2 | + | |
3 | +int npl_cmdi_init(npl_cmdi_t *ci) | |
4 | +{ | |
5 | + NPL_assert(ci); | |
6 | + | |
7 | + if (npl_cbuf_init(&ci->_argv, sizeof(wchar_t*), 32)) | |
8 | + return 1; // error | |
9 | + if (npl_sbuf_init(&ci->_cmd_buf)) | |
10 | + return 1; // error | |
11 | + if (npl_source_init(&ci->src)) | |
12 | + return 1; // error | |
13 | + ci->result = npl_var_new(L"_"); | |
14 | + if (ci->result == NULL) | |
15 | + return 1; // error | |
16 | + ci->argc = 0; | |
17 | + ci->argv = NULL; | |
18 | + | |
19 | + return 0; | |
20 | +} | |
21 | + | |
22 | +void npl_cmdi_final(npl_cmdi_t *ci) | |
23 | +{ | |
24 | + NPL_assert(ci); | |
25 | + | |
26 | + npl_cbuf_final(&ci->_argv); | |
27 | + npl_sbuf_final(&ci->_cmd_buf); | |
28 | + npl_source_final(&ci->src); | |
29 | + if (ci->result != NULL) { | |
30 | + npl_object_unref(NPL_OBJECT(ci->result)); | |
31 | + ci->result = NULL; | |
32 | + } | |
33 | +} | |
34 | + |
@@ -4,11 +4,13 @@ | ||
4 | 4 | #include "../nplu.h" |
5 | 5 | |
6 | 6 | // これは外部の拡張コマンド配列です(npcmdx.c)。 |
7 | -// 拡張コマンドを外すには、main()関数の中の | |
8 | -// この変数の登録をコメントアウトするなどして | |
9 | -// ください。 | |
10 | -extern npl_command_list_t npl_npcmdx_commands[]; | |
11 | 7 | |
8 | +// これは外部の拡張機能です(npcmdx.c)。 | |
9 | +// 拡張機能を外すには、main()関数の中の | |
10 | +// この関数の呼び出しをコメントアウトする | |
11 | +// などしてください。 | |
12 | +int npl_npcmdx_init(npl_cmd_t *cmd); | |
13 | + | |
12 | 14 | // helpコマンド |
13 | 15 | // 登録されているコマンドをすべて表示する |
14 | 16 | static int _help(npl_cmd_t *cmd, size_t argc, wchar_t *argv[]) |
@@ -64,17 +66,17 @@ | ||
64 | 66 | return 0; |
65 | 67 | } |
66 | 68 | |
67 | -// debug-modeコマンド | |
68 | -static int _debug_mode(npl_cmd_t *cmd, size_t argc, wchar_t *argv[]) | |
69 | +// flagsコマンド | |
70 | +static int _flags(npl_cmd_t *cmd, size_t argc, wchar_t *argv[]) | |
69 | 71 | { |
70 | 72 | size_t i; |
71 | 73 | int flag; |
72 | 74 | |
73 | 75 | if (argc < 2) { |
74 | - fprintf(stderr, "usage: debug-mode <on/off> <flags> ...\n"); | |
76 | + fprintf(stderr, "usage: flags <on/off> <flags> ...\n"); | |
75 | 77 | fprintf(stderr, " flags:\n"); |
76 | 78 | fprintf(stderr, " dump-argv [%s]\n", |
77 | - cmd->dmf_dump_argv ? "on" : "off"); | |
79 | + cmd->f_dump_argv ? "on" : "off"); | |
78 | 80 | return 0; |
79 | 81 | } |
80 | 82 |
@@ -88,7 +90,7 @@ | ||
88 | 90 | |
89 | 91 | for (i=2; i<argc; i++) { |
90 | 92 | if (NPL_wcscmp(argv[i], L"dump-argv") == 0) { |
91 | - cmd->dmf_dump_argv = flag; | |
93 | + cmd->f_dump_argv = flag; | |
92 | 94 | } else { |
93 | 95 | return 1; |
94 | 96 | } |
@@ -97,6 +99,62 @@ | ||
97 | 99 | return 0; |
98 | 100 | } |
99 | 101 | |
102 | +// cmdコマンド | |
103 | +static int _cmd(npl_cmd_t *cmd, size_t argc, wchar_t *argv[]) | |
104 | +{ | |
105 | + npl_cmdi_t ci; | |
106 | + npl_file_t *file; | |
107 | + size_t i; | |
108 | + wchar_t *buf; | |
109 | + | |
110 | + if (argc < 2) { | |
111 | + fprintf(stderr, "usage: cmd <file> ...\n"); | |
112 | + return 1; | |
113 | + } | |
114 | + | |
115 | + for (i=1; i<argc; i++) { | |
116 | + file = npl_file_open(argv[i], L"r"); | |
117 | + if (file == NULL) | |
118 | + return 1; | |
119 | + if (npl_cmd_push_cmdi(cmd, &ci)) { | |
120 | + npl_file_close(file); | |
121 | + npl_object_unref(NPL_OBJECT(file)); | |
122 | + return 1; | |
123 | + } | |
124 | + | |
125 | + while (1) { | |
126 | + if (npl_stream_error(&file->stream)) { | |
127 | + npl_file_close(file); | |
128 | + npl_object_unref(NPL_OBJECT(file)); | |
129 | + npl_cmd_pop_cmdi(cmd); | |
130 | + return 1; | |
131 | + } | |
132 | + if (npl_stream_eof(&file->stream)) | |
133 | + break; | |
134 | + | |
135 | + if (npl_source_is_buffered(&cmd->ci->src)) { | |
136 | + buf = npl_source_get_write_buffer( | |
137 | + &cmd->ci->src); | |
138 | + npl_stream_read( | |
139 | + &file->stream, | |
140 | + buf, | |
141 | + NPL_SOURCE_BUFFER_SIZE); | |
142 | + npl_source_swap(&cmd->ci->src); | |
143 | + } | |
144 | + if (npl_cmd_do(cmd)) { | |
145 | + fprintf(stderr, "npl_cmd_do() failed.\n"); | |
146 | + break; | |
147 | + } | |
148 | + } | |
149 | + | |
150 | + npl_file_close(file); | |
151 | + npl_object_unref(NPL_OBJECT(file)); | |
152 | + npl_cmd_pop_cmdi(cmd); | |
153 | + } | |
154 | + | |
155 | + return 0; | |
156 | +} | |
157 | + | |
100 | 158 | // コマンド配列 |
101 | 159 | static npl_command_list_t _embedded_commands[] = { |
102 | 160 | {L"help", _help}, |
@@ -103,7 +161,8 @@ | ||
103 | 161 | {L"quit", _quit}, |
104 | 162 | {L"print", _print}, |
105 | 163 | {L"set", _set}, |
106 | - {L"debug-mode", _debug_mode}, | |
164 | + {L"flags", _flags}, | |
165 | + {L"cmd", _cmd}, | |
107 | 166 | {NULL, NULL}, |
108 | 167 | }; |
109 | 168 |
@@ -110,19 +169,22 @@ | ||
110 | 169 | // dump_argvイベントの実行 |
111 | 170 | static void _dump_argv(npl_cmd_t *cmd) |
112 | 171 | { |
113 | - wchar_t **v = npl_cbuf_get(&cmd->_argv, 0); | |
114 | 172 | size_t i; |
115 | 173 | |
116 | - for (i=0; i<cmd->argc; i++) | |
117 | - printf(" ARGV[%u]: %S\n", i, v[i]); | |
174 | + for (i=0; i<cmd->ci->argc; i++) | |
175 | + printf(" ARGV[%u]: %S\n", i, cmd->ci->argv[i]); | |
118 | 176 | } |
119 | 177 | |
120 | 178 | // unknown_commandイベントの実行 |
121 | 179 | static void _unknown_command(npl_cmd_t *cmd) |
122 | 180 | { |
123 | - wchar_t **v = npl_cbuf_get(&cmd->_argv, 0); | |
181 | + printf("unknown command: %S\n", cmd->ci->argv[0]); | |
182 | +} | |
124 | 183 | |
125 | - printf("unknown command: %S\n", v[0]); | |
184 | +// failedイベントの実行 | |
185 | +static void _failed(npl_cmd_t *cmd) | |
186 | +{ | |
187 | + printf("%S command failed.\n", cmd->ci->argv[0]); | |
126 | 188 | } |
127 | 189 | |
128 | 190 | // イベントコールバック |
@@ -141,6 +203,9 @@ | ||
141 | 203 | case NPL_CE_UNKNOWN_COMMAND: |
142 | 204 | _unknown_command(e->cmd); |
143 | 205 | break; |
206 | + case NPL_CE_FAILED: | |
207 | + _failed(e->cmd); | |
208 | + break; | |
144 | 209 | default: |
145 | 210 | break; |
146 | 211 | } |
@@ -151,6 +216,7 @@ | ||
151 | 216 | int main(int argc, char *argv[]) |
152 | 217 | { |
153 | 218 | npl_cmd_t *cmd; |
219 | + npl_cmdi_t ci; | |
154 | 220 | wchar_t *buf; |
155 | 221 | FILE *fp = stdin; |
156 | 222 |
@@ -176,14 +242,18 @@ | ||
176 | 242 | fprintf(stderr, "npl_cmd_add_listener() failed.\n"); |
177 | 243 | exit(1); |
178 | 244 | } |
245 | + if (npl_cmd_push_cmdi(cmd, &ci)) { | |
246 | + fprintf(stderr, "npl_cmd_push_cmdi() failed.\n"); | |
247 | + exit(1); | |
248 | + } | |
179 | 249 | if (npl_cmd_add_command_list(cmd, _embedded_commands)) { |
180 | 250 | fprintf(stderr, "npl_cmd_add_command_list() failed.\n"); |
181 | 251 | exit(1); |
182 | 252 | } |
183 | - if (npl_cmd_add_command_list(cmd, npl_npcmdx_commands)) { | |
184 | - fprintf(stderr, "npl_cmd_add_command_list() failed.\n"); | |
253 | + if (npl_npcmdx_init(cmd)) { | |
254 | + fprintf(stderr, "npl_npcmdx_init() failed.\n"); | |
185 | 255 | exit(1); |
186 | - } | |
256 | + } | |
187 | 257 | |
188 | 258 | // インタプリタ処理 |
189 | 259 | while (npl_cmd_is_done(cmd)) { |
@@ -193,12 +263,12 @@ | ||
193 | 263 | } |
194 | 264 | if (feof(fp)) |
195 | 265 | break; |
196 | - if (npl_source_is_buffered(&cmd->src)) { | |
266 | + if (npl_source_is_buffered(&cmd->ci->src)) { | |
197 | 267 | if (fp == stdin) |
198 | 268 | printf(" >> "); |
199 | - buf = npl_source_get_write_buffer(&cmd->src); | |
269 | + buf = npl_source_get_write_buffer(&cmd->ci->src); | |
200 | 270 | fgetws(buf, NPL_SOURCE_BUFFER_SIZE, fp); |
201 | - npl_source_swap(&cmd->src); | |
271 | + npl_source_swap(&cmd->ci->src); | |
202 | 272 | } |
203 | 273 | if (npl_cmd_do(cmd)) { |
204 | 274 | fprintf(stderr, "npl_cmd_do() failed.\n"); |
@@ -52,7 +52,6 @@ | ||
52 | 52 | return 1; |
53 | 53 | for (i=2; i<argc; i++) |
54 | 54 | npl_stream_print(&file->stream, argv[i]); |
55 | - npl_stream_print(&file->stream, L"\n"); | |
56 | 55 | |
57 | 56 | return 0; |
58 | 57 | } |
@@ -92,7 +91,7 @@ | ||
92 | 91 | return 0; |
93 | 92 | } |
94 | 93 | |
95 | -npl_command_list_t npl_npcmdx_commands[] = { | |
94 | +static npl_command_list_t npl_npcmdx_commands[] = { | |
96 | 95 | {L"open", _cmdx_open}, |
97 | 96 | {L"close", _cmdx_close}, |
98 | 97 | {L"puts", _cmdx_puts}, |
@@ -100,3 +99,64 @@ | ||
100 | 99 | {NULL, NULL}, |
101 | 100 | }; |
102 | 101 | |
102 | +static int _setup_std(npl_cmd_t *cmd) | |
103 | +{ | |
104 | + npl_file_t *out = NULL, *in = NULL, *er = NULL; | |
105 | + npl_var_t *var; | |
106 | + | |
107 | + if ((out = npl_file_stdout()) == NULL) | |
108 | + goto ERROR; | |
109 | + if ((in = npl_file_stdin()) == NULL) | |
110 | + goto ERROR; | |
111 | + if ((er = npl_file_stderr()) == NULL) | |
112 | + goto ERROR; | |
113 | + | |
114 | + // STDOUT | |
115 | + var = npl_cmd_get_var(cmd, L"STDOUT"); | |
116 | + if (var == NULL) | |
117 | + return 1; | |
118 | + if (npl_var_set_object(var, NPL_OBJECT(out))) | |
119 | + return 1; | |
120 | + npl_var_set_immutable(var); | |
121 | + | |
122 | + // STDIN | |
123 | + var = npl_cmd_get_var(cmd, L"STDIN"); | |
124 | + if (var == NULL) | |
125 | + return 1; | |
126 | + if (npl_var_set_object(var, NPL_OBJECT(in))) | |
127 | + return 1; | |
128 | + npl_var_set_immutable(var); | |
129 | + | |
130 | + // STDERR | |
131 | + var = npl_cmd_get_var(cmd, L"STDERR"); | |
132 | + if (var == NULL) | |
133 | + return 1; | |
134 | + if (npl_var_set_object(var, NPL_OBJECT(er))) | |
135 | + return 1; | |
136 | + npl_var_set_immutable(var); | |
137 | + | |
138 | + return 0; | |
139 | +ERROR: | |
140 | + if (out != NULL) | |
141 | + npl_object_unref(NPL_OBJECT(out)); | |
142 | + if (in != NULL) | |
143 | + npl_object_unref(NPL_OBJECT(in)); | |
144 | + if (er != NULL) | |
145 | + npl_object_unref(NPL_OBJECT(er)); | |
146 | + return 1; | |
147 | +} | |
148 | + | |
149 | +int npl_npcmdx_init(npl_cmd_t *cmd) | |
150 | +{ | |
151 | + // 拡張コマンドの登録 | |
152 | + if (npl_cmd_add_command_list(cmd, npl_npcmdx_commands)) | |
153 | + return 1; | |
154 | + | |
155 | + // 標準入出力変数のセット | |
156 | + if (_setup_std(cmd)) | |
157 | + return 1; | |
158 | + | |
159 | + return 0; | |
160 | +} | |
161 | + | |
162 | + |
@@ -74,6 +74,7 @@ | ||
74 | 74 | typedef struct npl_stack_t npl_stack_t; |
75 | 75 | typedef struct npl_vt_t npl_vt_t; |
76 | 76 | typedef struct npl_source_t npl_source_t; |
77 | +typedef struct npl_cmdi_t npl_cmdi_t; | |
77 | 78 | |
78 | 79 | // 型情報付き構造体 |
79 | 80 | typedef struct npl_struct_t npl_struct_t; |
@@ -840,24 +841,12 @@ | ||
840 | 841 | |
841 | 842 | struct npl_cmd_t { |
842 | 843 | npl_state_t state; |
843 | - npl_cbuf_t _argv; | |
844 | - npl_sbuf_t _cmd_buf; | |
845 | - npl_source_t src; | |
846 | - | |
847 | - int f_lf; // 改行 | |
848 | - int f_sq, f_dq; // シングル・ダブルクォート | |
849 | - int f_es; // エスケープ・シーケンス | |
850 | - int f_comment; // コメント | |
851 | - | |
852 | - size_t argc; | |
853 | - wchar_t **argv; | |
854 | - npl_var_t *result; | |
855 | - | |
856 | 844 | npl_command_list_t *commands[8]; // 静的配列のみ |
857 | 845 | size_t _commands_len; |
846 | + npl_cmdi_t *ci; | |
858 | 847 | |
859 | - // debug mode flags | |
860 | - int dmf_dump_argv; | |
848 | + // flags | |
849 | + int f_dump_argv; | |
861 | 850 | }; |
862 | 851 | |
863 | 852 | int npl_cmd_init(npl_cmd_t *cmd); |
@@ -869,6 +858,8 @@ | ||
869 | 858 | void npl_cmd_quit(npl_cmd_t *cmd); |
870 | 859 | int npl_cmd_is_done(npl_cmd_t *cmd); |
871 | 860 | int npl_cmd_add_command_list(npl_cmd_t *cmd, npl_command_list_t *list); |
861 | +int npl_cmd_push_cmdi(npl_cmd_t *cmd, npl_cmdi_t *ci); | |
862 | +void npl_cmd_pop_cmdi(npl_cmd_t *cmd); | |
872 | 863 | int npl_cmd_do(npl_cmd_t *cmd); |
873 | 864 | |
874 | 865 | npl_var_t* npl_cmd_get_var(npl_cmd_t *cmd, wchar_t *name); |
@@ -900,5 +891,25 @@ | ||
900 | 891 | void npl_cmd_unknown_command(npl_cmd_t *cmd); |
901 | 892 | void npl_cmd_failed(npl_cmd_t *cmd); |
902 | 893 | |
894 | +// cmdi (cmd interpreter data) | |
895 | +struct npl_cmdi_t { | |
896 | + npl_cmdi_t *prev; | |
897 | + npl_cbuf_t _argv; | |
898 | + npl_sbuf_t _cmd_buf; | |
899 | + npl_source_t src; | |
900 | + int lf; // 改行 | |
901 | + int sq, dq; // シングル・ダブルクォート | |
902 | + int es; // エスケープ・シーケンス | |
903 | + int comment; // コメント | |
904 | + | |
905 | + size_t argc; | |
906 | + wchar_t **argv; | |
907 | + npl_var_t *result; | |
908 | +}; | |
909 | + | |
910 | +int npl_cmdi_init(npl_cmdi_t *ci); | |
911 | +void npl_cmdi_final(npl_cmdi_t *ci); | |
912 | + | |
913 | + | |
903 | 914 | #endif /* _NPL_H */ |
904 | 915 |