• R/O
  • SSH
  • HTTPS

npl: 提交


Commit MetaInfo

修订版110 (tree)
时间2017-10-25 16:10:17
作者tamiya25

Log Message

cmdコマンド追加

更改概述

差异

--- trunk/npl/Makefile (revision 109)
+++ trunk/npl/Makefile (revision 110)
@@ -6,7 +6,7 @@
66 sm.o uniface.o iptr.o file.o iface.o \
77 listener.o args.o struct.o \
88 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
1010 ar rcs libnpl.a npl.o object.o stream.o str.o \
1111 mbstr.o type.o sbuf.o buf.o \
1212 chunk.o val.o var.o tuple.o \
@@ -15,7 +15,8 @@
1515 sm.o uniface.o iptr.o file.o iface.o \
1616 listener.o args.o struct.o \
1717 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
1920
2021 npl.o: npl.c npl.h
2122 gcc -Wall -c npl.c
@@ -122,6 +123,9 @@
122123 source.o: source.c npl.h
123124 gcc -Wall -c source.c
124125
126+cmdi.o: cmdi.c npl.h
127+ gcc -Wall -c cmdi.c
128+
125129 clean:
126130 rm -f *.o
127131 rm -f libnpl.a
--- trunk/npl/cmd.c (revision 109)
+++ trunk/npl/cmd.c (revision 110)
@@ -7,8 +7,8 @@
77 // 引数配列をクリアする
88 static void _reset_args(npl_cmd_t *cmd)
99 {
10- npl_cbuf_clear(&cmd->_argv);
11- cmd->argc = 0;
10+ npl_cbuf_clear(&cmd->ci->_argv);
11+ cmd->ci->argc = 0;
1212 }
1313
1414 // 引数配列に1つ追加する
@@ -17,15 +17,15 @@
1717 wchar_t **v;
1818 size_t new_argc;
1919
20- if (npl_add(cmd->argc, 1, &new_argc))
20+ if (npl_add(cmd->ci->argc, 1, &new_argc))
2121 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))
2424 return 1; // error
2525
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;
2929 return 0;
3030 }
3131
@@ -37,7 +37,7 @@
3737 npl_str_t *s;
3838
3939 if (NPL_wcscmp(L"_", &str[1]) == 0)
40- var = cmd->result;
40+ var = cmd->ci->result;
4141 else
4242 var = npl_cmd_get_var(cmd, &str[1]);
4343
@@ -63,27 +63,27 @@
6363 wchar_t **argv, *str;
6464 size_t argc;
6565
66- cmd_buf = &cmd->_cmd_buf;
66+ cmd_buf = &cmd->ci->_cmd_buf;
6767
6868 // 文字の切り出し
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);
7272 break;
7373 }
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++;
7777 if (npl_sbuf_put(cmd_buf, L'\0'))
7878 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);
8181 break;
8282 }
83- if (cmd->f_comment)
83+ if (cmd->ci->comment)
8484 continue;
85- if (cmd->f_es) {
86- switch (*cmd->src.buf) {
85+ if (cmd->ci->es) {
86+ switch (*cmd->ci->src.buf) {
8787 case L's':
8888 if (npl_sbuf_put(cmd_buf, L' '))
8989 goto ERROR;
@@ -111,44 +111,44 @@
111111 default:
112112 goto ERROR;
113113 }
114- cmd->f_es = 0;
114+ cmd->ci->es = 0;
115115 continue;
116116 }
117- if (cmd->f_sq) {
118- switch (*cmd->src.buf) {
117+ if (cmd->ci->sq) {
118+ switch (*cmd->ci->src.buf) {
119119 case L'\'':
120120 if (npl_sbuf_put(cmd_buf, L'\0'))
121121 goto ERROR;
122- cmd->f_sq = 0;
122+ cmd->ci->sq = 0;
123123 break;
124124 case L'\\':
125- cmd->f_es = 1;
125+ cmd->ci->es = 1;
126126 break;
127127 default:
128- if (npl_sbuf_put(cmd_buf, *cmd->src.buf))
128+ if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf))
129129 goto ERROR;
130130 break;
131131 }
132132 continue;
133133 }
134- if (cmd->f_dq) {
135- switch (*cmd->src.buf) {
134+ if (cmd->ci->dq) {
135+ switch (*cmd->ci->src.buf) {
136136 case L'"':
137137 if (npl_sbuf_put(cmd_buf, L'\0'))
138138 goto ERROR;
139- cmd->f_dq = 0;
139+ cmd->ci->dq = 0;
140140 break;
141141 case L'\\':
142- cmd->f_es = 1;
142+ cmd->ci->es = 1;
143143 break;
144144 default:
145- if (npl_sbuf_put(cmd_buf, *cmd->src.buf))
145+ if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf))
146146 goto ERROR;
147147 break;
148148 }
149149 continue;
150150 }
151- switch (*cmd->src.buf) {
151+ switch (*cmd->ci->src.buf) {
152152 case L' ':
153153 case L'\t':
154154 if (npl_sbuf_put(cmd_buf, L'\0'))
@@ -155,10 +155,10 @@
155155 goto ERROR;
156156 break;
157157 case L'#':
158- cmd->f_comment = 1;
158+ cmd->ci->comment = 1;
159159 break;
160160 case L'\'':
161- cmd->f_sq = 1;
161+ cmd->ci->sq = 1;
162162 if (npl_sbuf_put(cmd_buf, L'\0'))
163163 goto ERROR;
164164 if (npl_sbuf_put(cmd_buf, L'\''))
@@ -165,7 +165,7 @@
165165 goto ERROR;
166166 break;
167167 case L'"':
168- cmd->f_dq = 1;
168+ cmd->ci->dq = 1;
169169 if (npl_sbuf_put(cmd_buf, L'\0'))
170170 goto ERROR;
171171 if (npl_sbuf_put(cmd_buf, L'"'))
@@ -172,12 +172,12 @@
172172 goto ERROR;
173173 break;
174174 default:
175- if (npl_sbuf_put(cmd_buf, *cmd->src.buf))
175+ if (npl_sbuf_put(cmd_buf, *cmd->ci->src.buf))
176176 goto ERROR;
177177 break;
178178 }
179179 }
180- if (cmd->f_lf == 0)
180+ if (cmd->ci->lf == 0)
181181 return 1; // コマンド入力中
182182
183183 // コマンドライン引数配列を作る
@@ -196,11 +196,11 @@
196196 }
197197 if (_add_arg(cmd, NULL))
198198 goto ERROR;
199- cmd->argc -= 1;
199+ cmd->ci->argc -= 1;
200200
201201 // コマンドライン引数の変換処理
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);
204204 for (i=1; i<argc; i++) {
205205 str = argv[i];
206206 switch (str[0]) {
@@ -213,7 +213,7 @@
213213 break;
214214 }
215215 }
216- cmd->argv = argv;
216+ cmd->ci->argv = argv;
217217
218218 return 0; // コマンド入力完了
219219
@@ -227,12 +227,12 @@
227227 npl_command_list_t **list = cmd->commands;
228228 npl_command_list_t *cl;
229229 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);
231231 wchar_t *name;
232232
233233 if (list == NULL)
234234 return 0;
235- if (cmd->argc == 0)
235+ if (cmd->ci->argc == 0)
236236 return 0;
237237 name = v[0];
238238 for (i=0; i<cmd->_commands_len; i++) {
@@ -243,7 +243,10 @@
243243 while (cl[j].name != NULL) {
244244 if (NPL_wcscmp(cl[j].name, name) == 0) {
245245 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);
247250 }
248251 j++;
249252 }
@@ -265,17 +268,17 @@
265268 switch (status) {
266269 case 0:
267270 // コマンド行入力完了
268- if (cmd->dmf_dump_argv)
271+ if (cmd->f_dump_argv)
269272 npl_cmd_dump_argv(cmd);
270273 if (_cmd_run(cmd))
271274 npl_cmd_failed(cmd);
272275
273276 // 状態リセット
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;
279282 break;
280283 case 1:
281284 // コマンド行入力中
@@ -294,18 +297,6 @@
294297 if (npl_state_init(&cmd->state))
295298 return 1; // error
296299 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;
309300 cmd->_commands_len =
310301 sizeof(cmd->commands) / sizeof(npl_command_list_t*);
311302
@@ -349,6 +340,31 @@
349340 return NPL_STATE(cmd)->istate.running;
350341 }
351342
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+
352368 int npl_cmd_do(npl_cmd_t *cmd)
353369 {
354370 NPL_assert(cmd);
@@ -424,7 +440,7 @@
424440 {
425441 NPL_assert(cmd);
426442
427- if (npl_var_set_object(cmd->result, object)) {
443+ if (npl_var_set_object(cmd->ci->result, object)) {
428444 npl_object_unref(object);
429445 return 1; // error
430446 }
@@ -449,7 +465,7 @@
449465 {
450466 NPL_assert(cmd);
451467
452- if (npl_var_set_iface(cmd->result, iface)) {
468+ if (npl_var_set_iface(cmd->ci->result, iface)) {
453469 npl_iface_unref(iface);
454470 return 1; // error
455471 }
@@ -477,7 +493,7 @@
477493 {
478494 NPL_assert(cmd);
479495
480- if (npl_var_set_uniface(cmd->result, uniface)) {
496+ if (npl_var_set_uniface(cmd->ci->result, uniface)) {
481497 npl_uniface_unref(uniface);
482498 return 1; // error
483499 }
@@ -502,7 +518,7 @@
502518 {
503519 NPL_assert(cmd);
504520
505- if (npl_var_set_null(cmd->result))
521+ if (npl_var_set_null(cmd->ci->result))
506522 return 1; // error
507523
508524 if (name != NULL) {
@@ -520,7 +536,7 @@
520536 {
521537 NPL_assert(cmd);
522538
523- if (npl_var_set_bool(cmd->result, b))
539+ if (npl_var_set_bool(cmd->ci->result, b))
524540 return 1; // error
525541
526542 if (name != NULL) {
@@ -538,7 +554,7 @@
538554 {
539555 NPL_assert(cmd);
540556
541- if (npl_var_set_byte(cmd->result, byte))
557+ if (npl_var_set_byte(cmd->ci->result, byte))
542558 return 1; // error
543559
544560 if (name != NULL) {
@@ -556,7 +572,7 @@
556572 {
557573 NPL_assert(cmd);
558574
559- if (npl_var_set_size(cmd->result, size))
575+ if (npl_var_set_size(cmd->ci->result, size))
560576 return 1; // error
561577
562578 if (name != NULL) {
@@ -574,7 +590,7 @@
574590 {
575591 NPL_assert(cmd);
576592
577- if (npl_var_set_int(cmd->result, i))
593+ if (npl_var_set_int(cmd->ci->result, i))
578594 return 1; // error
579595
580596 if (name != NULL) {
@@ -592,7 +608,7 @@
592608 {
593609 NPL_assert(cmd);
594610
595- if (npl_var_set_uint(cmd->result, u))
611+ if (npl_var_set_uint(cmd->ci->result, u))
596612 return 1; // error
597613
598614 if (name != NULL) {
@@ -610,7 +626,7 @@
610626 {
611627 NPL_assert(cmd);
612628
613- if (npl_var_set_long(cmd->result, l))
629+ if (npl_var_set_long(cmd->ci->result, l))
614630 return 1; // error
615631
616632 if (name != NULL) {
@@ -628,7 +644,7 @@
628644 {
629645 NPL_assert(cmd);
630646
631- if (npl_var_set_ulong(cmd->result, ul))
647+ if (npl_var_set_ulong(cmd->ci->result, ul))
632648 return 1; // error
633649
634650 if (name != NULL) {
@@ -646,7 +662,7 @@
646662 {
647663 NPL_assert(cmd);
648664
649- if (npl_var_set_float(cmd->result, f))
665+ if (npl_var_set_float(cmd->ci->result, f))
650666 return 1; // error
651667
652668 if (name != NULL) {
@@ -664,7 +680,7 @@
664680 {
665681 NPL_assert(cmd);
666682
667- if (npl_var_set_wchar(cmd->result, wc))
683+ if (npl_var_set_wchar(cmd->ci->result, wc))
668684 return 1; // error
669685
670686 if (name != NULL) {
@@ -682,7 +698,7 @@
682698 {
683699 NPL_assert(cmd);
684700
685- if (npl_var_set_mbchar(cmd->result, mbc))
701+ if (npl_var_set_mbchar(cmd->ci->result, mbc))
686702 return 1; // error
687703
688704 if (name != NULL) {
@@ -781,13 +797,8 @@
781797 {
782798 npl_cmd_t *cmd = NPL_CMD(p);
783799
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);
791802 }
792803
793804 npl_type_t _npl_cmd_type = {
--- trunk/npl/cmdi.c (nonexistent)
+++ trunk/npl/cmdi.c (revision 110)
@@ -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+
--- trunk/npl/lang/npcmd.c (revision 109)
+++ trunk/npl/lang/npcmd.c (revision 110)
@@ -4,11 +4,13 @@
44 #include "../nplu.h"
55
66 // これは外部の拡張コマンド配列です(npcmdx.c)。
7-// 拡張コマンドを外すには、main()関数の中の
8-// この変数の登録をコメントアウトするなどして
9-// ください。
10-extern npl_command_list_t npl_npcmdx_commands[];
117
8+// これは外部の拡張機能です(npcmdx.c)。
9+// 拡張機能を外すには、main()関数の中の
10+// この関数の呼び出しをコメントアウトする
11+// などしてください。
12+int npl_npcmdx_init(npl_cmd_t *cmd);
13+
1214 // helpコマンド
1315 // 登録されているコマンドをすべて表示する
1416 static int _help(npl_cmd_t *cmd, size_t argc, wchar_t *argv[])
@@ -64,17 +66,17 @@
6466 return 0;
6567 }
6668
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[])
6971 {
7072 size_t i;
7173 int flag;
7274
7375 if (argc < 2) {
74- fprintf(stderr, "usage: debug-mode <on/off> <flags> ...\n");
76+ fprintf(stderr, "usage: flags <on/off> <flags> ...\n");
7577 fprintf(stderr, " flags:\n");
7678 fprintf(stderr, " dump-argv [%s]\n",
77- cmd->dmf_dump_argv ? "on" : "off");
79+ cmd->f_dump_argv ? "on" : "off");
7880 return 0;
7981 }
8082
@@ -88,7 +90,7 @@
8890
8991 for (i=2; i<argc; i++) {
9092 if (NPL_wcscmp(argv[i], L"dump-argv") == 0) {
91- cmd->dmf_dump_argv = flag;
93+ cmd->f_dump_argv = flag;
9294 } else {
9395 return 1;
9496 }
@@ -97,6 +99,62 @@
9799 return 0;
98100 }
99101
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+
100158 // コマンド配列
101159 static npl_command_list_t _embedded_commands[] = {
102160 {L"help", _help},
@@ -103,7 +161,8 @@
103161 {L"quit", _quit},
104162 {L"print", _print},
105163 {L"set", _set},
106- {L"debug-mode", _debug_mode},
164+ {L"flags", _flags},
165+ {L"cmd", _cmd},
107166 {NULL, NULL},
108167 };
109168
@@ -110,19 +169,22 @@
110169 // dump_argvイベントの実行
111170 static void _dump_argv(npl_cmd_t *cmd)
112171 {
113- wchar_t **v = npl_cbuf_get(&cmd->_argv, 0);
114172 size_t i;
115173
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]);
118176 }
119177
120178 // unknown_commandイベントの実行
121179 static void _unknown_command(npl_cmd_t *cmd)
122180 {
123- wchar_t **v = npl_cbuf_get(&cmd->_argv, 0);
181+ printf("unknown command: %S\n", cmd->ci->argv[0]);
182+}
124183
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]);
126188 }
127189
128190 // イベントコールバック
@@ -141,6 +203,9 @@
141203 case NPL_CE_UNKNOWN_COMMAND:
142204 _unknown_command(e->cmd);
143205 break;
206+ case NPL_CE_FAILED:
207+ _failed(e->cmd);
208+ break;
144209 default:
145210 break;
146211 }
@@ -151,6 +216,7 @@
151216 int main(int argc, char *argv[])
152217 {
153218 npl_cmd_t *cmd;
219+ npl_cmdi_t ci;
154220 wchar_t *buf;
155221 FILE *fp = stdin;
156222
@@ -176,14 +242,18 @@
176242 fprintf(stderr, "npl_cmd_add_listener() failed.\n");
177243 exit(1);
178244 }
245+ if (npl_cmd_push_cmdi(cmd, &ci)) {
246+ fprintf(stderr, "npl_cmd_push_cmdi() failed.\n");
247+ exit(1);
248+ }
179249 if (npl_cmd_add_command_list(cmd, _embedded_commands)) {
180250 fprintf(stderr, "npl_cmd_add_command_list() failed.\n");
181251 exit(1);
182252 }
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");
185255 exit(1);
186- }
256+ }
187257
188258 // インタプリタ処理
189259 while (npl_cmd_is_done(cmd)) {
@@ -193,12 +263,12 @@
193263 }
194264 if (feof(fp))
195265 break;
196- if (npl_source_is_buffered(&cmd->src)) {
266+ if (npl_source_is_buffered(&cmd->ci->src)) {
197267 if (fp == stdin)
198268 printf(" >> ");
199- buf = npl_source_get_write_buffer(&cmd->src);
269+ buf = npl_source_get_write_buffer(&cmd->ci->src);
200270 fgetws(buf, NPL_SOURCE_BUFFER_SIZE, fp);
201- npl_source_swap(&cmd->src);
271+ npl_source_swap(&cmd->ci->src);
202272 }
203273 if (npl_cmd_do(cmd)) {
204274 fprintf(stderr, "npl_cmd_do() failed.\n");
--- trunk/npl/lang/npcmdx.c (revision 109)
+++ trunk/npl/lang/npcmdx.c (revision 110)
@@ -52,7 +52,6 @@
5252 return 1;
5353 for (i=2; i<argc; i++)
5454 npl_stream_print(&file->stream, argv[i]);
55- npl_stream_print(&file->stream, L"\n");
5655
5756 return 0;
5857 }
@@ -92,7 +91,7 @@
9291 return 0;
9392 }
9493
95-npl_command_list_t npl_npcmdx_commands[] = {
94+static npl_command_list_t npl_npcmdx_commands[] = {
9695 {L"open", _cmdx_open},
9796 {L"close", _cmdx_close},
9897 {L"puts", _cmdx_puts},
@@ -100,3 +99,64 @@
10099 {NULL, NULL},
101100 };
102101
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+
--- trunk/npl/npl.h (revision 109)
+++ trunk/npl/npl.h (revision 110)
@@ -74,6 +74,7 @@
7474 typedef struct npl_stack_t npl_stack_t;
7575 typedef struct npl_vt_t npl_vt_t;
7676 typedef struct npl_source_t npl_source_t;
77+typedef struct npl_cmdi_t npl_cmdi_t;
7778
7879 // 型情報付き構造体
7980 typedef struct npl_struct_t npl_struct_t;
@@ -840,24 +841,12 @@
840841
841842 struct npl_cmd_t {
842843 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-
856844 npl_command_list_t *commands[8]; // 静的配列のみ
857845 size_t _commands_len;
846+ npl_cmdi_t *ci;
858847
859- // debug mode flags
860- int dmf_dump_argv;
848+ // flags
849+ int f_dump_argv;
861850 };
862851
863852 int npl_cmd_init(npl_cmd_t *cmd);
@@ -869,6 +858,8 @@
869858 void npl_cmd_quit(npl_cmd_t *cmd);
870859 int npl_cmd_is_done(npl_cmd_t *cmd);
871860 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);
872863 int npl_cmd_do(npl_cmd_t *cmd);
873864
874865 npl_var_t* npl_cmd_get_var(npl_cmd_t *cmd, wchar_t *name);
@@ -900,5 +891,25 @@
900891 void npl_cmd_unknown_command(npl_cmd_t *cmd);
901892 void npl_cmd_failed(npl_cmd_t *cmd);
902893
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+
903914 #endif /* _NPL_H */
904915
Show on old repository browser