シェルスクリプト言語xyzshのソースコード。
Revision | 495b4d49e7d5a9c549e0568491651c5d12fc9f62 (tree) |
---|---|
Time | 2013-01-04 01:04:40 |
Author | ![]() |
Commiter | ab25q |
1.2.8
@@ -1,4 +1,18 @@ | ||
1 | 1 | |
2 | +2013 4th January version 1.2.8 | |
3 | + | |
4 | + 1. Refactoring. | |
5 | + | |
6 | + 2. Fixed a memory leak bug. | |
7 | + | |
8 | + 3. Dynamic Library version up. This change involves mfiler4. | |
9 | + | |
10 | +2013 1月4日 version 1.2.8 | |
11 | + | |
12 | + 1. リファクタリング。 | |
13 | + 2. メモリーリークを修正。 | |
14 | + 3. ダイナミックライブラリのバージョンアップ。mfiler4にも影響があります。mfiler4は1.0.7から、このxyzshに対応します。 | |
15 | + | |
2 | 16 | 2012 12月20日 version 1.2.7 |
3 | 17 | |
4 | 18 | 1. グロブの展開がパーサー時ではなくて実行時に起こるように変更。 |
@@ -87,6 +87,12 @@ libxyzsh.dylib: libxyzsh.$(SO_VERSION).dylib | ||
87 | 87 | cp libxyzsh.$(SO_VERSION).dylib libxyzsh.1.dylib |
88 | 88 | cp libxyzsh.$(SO_VERSION).dylib libxyzsh.dylib |
89 | 89 | |
90 | +permission: | |
91 | + chmod 644 * | |
92 | + chmod 755 .git man src configure | |
93 | + chmod 644 src/*.c | |
94 | + chmod 644 src/xyzsh/*.h | |
95 | + | |
90 | 96 | ######################################################### |
91 | 97 | # install |
92 | 98 | ######################################################### |
@@ -168,6 +168,9 @@ Files | ||
168 | 168 | src/stack.c --> xyzsh stack object manager |
169 | 169 | src/string.c --> string library |
170 | 170 | src/vector.c --> dynamic array library |
171 | + src/nfun.c --> native function object | |
172 | + src/fd.c --> file discriptor object | |
173 | + src/extprog.c --> external program object | |
171 | 174 | |
172 | 175 | LINCENSE |
173 | 176 | MIT Lincense. |
@@ -207,15 +207,13 @@ xyzshが使用するファイル | ||
207 | 207 | src/xyzsh.c --> xyzshのその他のルーチンを集めている |
208 | 208 | src/readline.c --> readlineを扱っているソース。 |
209 | 209 | src/run.c --> xyzshのメインエンジン |
210 | - src/stack.c --> xyzshのスタックを扱う実装。xyzshはガベージコレクションとスタックとmalloc&deleteの3つのメモリ管理を | |
211 | - 使ってオブジェクトを生成したり開放したりしている。ただし、malloc&deleteによるオブジェクトの管理は | |
212 | - よほど内部を把握していないと予期せぬセグフォが起こるので、xyzshを組み込む場合にmalloc&deleteによる | |
213 | - オブジェクトの生成、開放を行うことはお勧めできない。 | |
214 | - (たとえば、xyzshコードをmallocで生成して、そのxyzshコードを実行している最中に、そのxyzshコードを含む | |
215 | - オブジェクトがdeleteされた場合などはセグフォを起こす) | |
210 | + src/stack.c --> xyzshのスタックを扱う実装。 | |
216 | 211 | src/string.c --> 文字列ライブラリ |
217 | 212 | src/uobject --> ユーザーオブジェクトの定義 |
218 | 213 | src/vector.c --> 動的配列の実装 |
214 | + src/nfun.c --> ネイティブ関数オブジェクトの実装 | |
215 | + src/fd.c --> ファイル記述子オブジェクトの実装 | |
216 | + src/extprog.c --> 外部プログラムオブジェクトの実装 | |
219 | 217 | |
220 | 218 | ラインセンス |
221 | 219 |
@@ -2,4 +2,9 @@ Fedoraなど各環境でコンパイルと日本語を通したselectorのチェ | ||
2 | 2 | |
3 | 3 | 端末のサイズを変えたときに画面が乱れる mfiler4 |
4 | 4 | |
5 | -コードの情報で複数の情報で変数を分けているやつは無駄なのでひとつに統一して論理演算で情報を操作する | |
5 | +Detected!! at file: src/block.c line:919 function:expand_env_to_command() addr:7f95128197d0 | |
6 | + Detected!! at file: src/block.c line:919 function:expand_env_to_command() addr:7f951292dbb0 | |
7 | + | |
8 | + | |
9 | + Detected!! at file: src/block.c line:919 function:expand_env_to_command() addr:7ff502820bb0 | |
10 | + Detected!! at file: src/block.c line:919 function:expand_env_to_command() addr:7ff502806d50 |
@@ -773,3 +773,11 @@ | ||
773 | 773 | |
774 | 774 | でコマンドの使い方を見ることができます。各コマンドのオプションなどはそちらで調べてください。 |
775 | 775 | |
776 | +3.5 xyzshの組み込みについて | |
777 | + | |
778 | + xyzshのメモリ管理について。xyzshはGCとスタックとmalloc&freeの3つのオブジェクトのメモリ管理を行なってます。しかし、以下の制限があります。 | |
779 | + GCで作り出されるオブジェクトはマークをさせるためにgRootObjectかgXyzshObjectから辿れるようにしなければなりません。(GCで管理されてgRootObjectかgXyzshObjectから辿れるコンテナオブジェクトに格納される必要がある)。でなければ、sweepで消されてしまいます。sweepは一定回数コードを実行すると自動的に実行されます。 | |
780 | + GCで作り出したコンテナオブジェクトにはGCで管理されるオブジェクトしか格納できません。同じようにスタックで作り出したコンテナオブジェクトにはスタックで管理されるオブジェクトを、MALLOCで作り出されるコンテナオブジェクトにはMALLOCで管理されるオブジェクトを格納してください。 | |
781 | + ユーザーによって定義される外部オブジェクト(EXTOBJ)の構造体内のオブジェクトではmallocによるオブジェクトの管理を行なってください。構造体内のオブジェクトをGCで管理を行なってmMarkFunでそのオブジェクトをマークしてもGCのオブジェクトのsweep順によっては正しく動作しません。セグメンテーションフォルトが起こる可能性もあります。ただし、blockオブジェクトはmallocによって管理できないので、blockオブジェクトは手動でマークしてください。stringオブジェクトもGCによって管理できるはずです。 | |
782 | + | |
783 | + |
@@ -3029,7 +3029,7 @@ SO_VERSION=1.5.5 | ||
3029 | 3029 | { $as_echo "$as_me:${as_lineno-$LINENO}: checking Operating System" >&5 |
3030 | 3030 | $as_echo_n "checking Operating System... " >&6; } |
3031 | 3031 | |
3032 | -OBJ="src/gc.o src/stack.o src/string.o src/list.o src/kanji.o src/debug.o src/hash.o src/vector.o src/block.o src/fun.o src/class.o src/completion.o src/xyzsh.o src/parser.o src/run.o src/readline.o src/curses.o src/cmd_base.o src/cmd_obj.o src/cmd_file.o src/cmd_str.o src/cmd_ary.o src/cmd_condition.o src/interface.o src/memchecker.o src/object.o src/uobject.o src/cmd_num.o src/cmd_curses.o" | |
3032 | +OBJ="src/gc.o src/stack.o src/string.o src/list.o src/kanji.o src/debug.o src/hash.o src/vector.o src/block.o src/fun.o src/class.o src/completion.o src/xyzsh.o src/parser.o src/run.o src/readline.o src/curses.o src/cmd_base.o src/cmd_obj.o src/cmd_file.o src/cmd_str.o src/cmd_ary.o src/cmd_condition.o src/interface.o src/memchecker.o src/object.o src/uobject.o src/cmd_num.o src/cmd_curses.o src/fd.o src/nfun.o src/extprog.o" | |
3033 | 3033 | |
3034 | 3034 | |
3035 | 3035 | if test `uname -s` = "Darwin"; then |
@@ -32,11 +32,11 @@ AC_SUBST(SYSTEM_MIGEMODIR) | ||
32 | 32 | ##################################################################### |
33 | 33 | # check operating systems |
34 | 34 | ##################################################################### |
35 | -SO_VERSION=1.5.5 | |
35 | +SO_VERSION=1.5.6 | |
36 | 36 | AC_SUBST(SO_VERSION) |
37 | 37 | AC_MSG_CHECKING(Operating System) |
38 | 38 | |
39 | -OBJ="src/gc.o src/stack.o src/string.o src/list.o src/kanji.o src/debug.o src/hash.o src/vector.o src/block.o src/fun.o src/class.o src/completion.o src/xyzsh.o src/parser.o src/run.o src/readline.o src/curses.o src/cmd_base.o src/cmd_obj.o src/cmd_file.o src/cmd_str.o src/cmd_ary.o src/cmd_condition.o src/interface.o src/memchecker.o src/object.o src/uobject.o src/cmd_num.o src/cmd_curses.o" | |
39 | +OBJ="src/gc.o src/stack.o src/string.o src/list.o src/kanji.o src/debug.o src/hash.o src/vector.o src/block.o src/fun.o src/class.o src/completion.o src/xyzsh.o src/parser.o src/run.o src/readline.o src/curses.o src/cmd_base.o src/cmd_obj.o src/cmd_file.o src/cmd_str.o src/cmd_ary.o src/cmd_condition.o src/interface.o src/memchecker.o src/object.o src/uobject.o src/cmd_num.o src/cmd_curses.o src/fd.o src/nfun.o src/extprog.o" | |
40 | 40 | AC_SUBST(OBJ) |
41 | 41 | |
42 | 42 | if test `uname -s` = "Darwin"; then |
@@ -1,4 +1,5 @@ | ||
1 | 1 | #include "config.h" |
2 | + | |
2 | 3 | #include "xyzsh/xyzsh.h" |
3 | 4 | #include <string.h> |
4 | 5 | #include <stdio.h> |
@@ -432,94 +433,6 @@ static void sCommand_copy_deeply_stack(sCommand* dest, sCommand* src) | ||
432 | 433 | dest->mRedirectsFileNamesRuntime = NULL; |
433 | 434 | } |
434 | 435 | |
435 | -static void sCommand_copy_deeply_malloc(sCommand* dest, sCommand* src) | |
436 | -{ | |
437 | - dest->mKind = src->mKind; | |
438 | - | |
439 | - dest->mArgs = MALLOC(sizeof(char*)*src->mArgsSize); | |
440 | - dest->mArgsFlags = MALLOC(sizeof(int)*src->mArgsSize); | |
441 | - dest->mArgsNum = src->mArgsNum; | |
442 | - dest->mArgsSize = src->mArgsSize; | |
443 | - | |
444 | - int i; | |
445 | - for(i=0; i<src->mArgsNum; i++) { | |
446 | - dest->mArgs[i] = STRDUP(src->mArgs[i]); | |
447 | - dest->mArgsFlags[i] = src->mArgsFlags[i]; | |
448 | - } | |
449 | - dest->mArgs[i] = NULL; | |
450 | - | |
451 | - dest->mEnvs = MALLOC(sizeof(sEnv)*src->mEnvsSize); | |
452 | - for(i=0; i<src->mEnvsNum; i++) { | |
453 | - dest->mEnvs[i].mKind = src->mEnvs[i].mKind; | |
454 | - | |
455 | - if(src->mEnvs[i].mKind == kEnv) { | |
456 | - dest->mEnvs[i].mName = STRDUP(src->mEnvs[i].mName); | |
457 | - dest->mEnvs[i].mKey = STRDUP(src->mEnvs[i].mKey); | |
458 | - dest->mEnvs[i].mKeyEnv = src->mEnvs[i].mKeyEnv; | |
459 | - dest->mEnvs[i].mDoubleDollar = src->mEnvs[i].mDoubleDollar; | |
460 | - } | |
461 | - else { | |
462 | - dest->mEnvs[i].mBlock = block_clone_malloc(src->mEnvs[i].mBlock); | |
463 | - dest->mEnvs[i].mDoubleDollar = src->mEnvs[i].mDoubleDollar; | |
464 | - dest->mEnvs[i].mLineField = src->mEnvs[i].mLineField; | |
465 | - } | |
466 | - } | |
467 | - dest->mEnvsNum = src->mEnvsNum; | |
468 | - dest->mEnvsSize = src->mEnvsSize; | |
469 | - | |
470 | -/* | |
471 | - dest->mArgsRuntime = MALLOC(sizeof(char*)*src->mArgsSizeRuntime); | |
472 | - dest->mArgsNumRuntime = src->mArgsNumRuntime; | |
473 | - dest->mArgsSizeRuntime = src->mArgsSizeRuntime; | |
474 | - | |
475 | - for(i=0; i<src->mArgsNumRuntime; i++) { | |
476 | - dest->mArgsRuntime[i] = STRDUP(src->mArgsRuntime[i]); | |
477 | - } | |
478 | - dest->mArgsRuntime[i] = NULL; | |
479 | -*/ | |
480 | - dest->mArgsRuntime = MALLOC(sizeof(char*)*3); | |
481 | - dest->mArgsSizeRuntime = 3; | |
482 | - dest->mArgsNumRuntime = 0; | |
483 | - | |
484 | - dest->mBlocks = MALLOC(sizeof(sObject*)*src->mBlocksSize); | |
485 | - dest->mBlocksNum = src->mBlocksNum; | |
486 | - dest->mBlocksSize = src->mBlocksSize; | |
487 | - | |
488 | - for(i=0; i<src->mBlocksNum; i++) { | |
489 | - dest->mBlocks[i] = block_clone_malloc(src->mBlocks[i]); | |
490 | - } | |
491 | - | |
492 | - dest->mRedirectsFileNames = MALLOC(sizeof(char*)*src->mRedirectsSize); | |
493 | - for(i=0; i<src->mRedirectsNum; i++) { | |
494 | - dest->mRedirectsFileNames[i] = STRDUP(src->mRedirectsFileNames[i]); | |
495 | - } | |
496 | - dest->mRedirects = MALLOC(sizeof(int)*src->mRedirectsSize); | |
497 | - for(i=0; i<src->mRedirectsNum; i++) { | |
498 | - dest->mRedirects[i] = src->mRedirects[i]; | |
499 | - } | |
500 | - dest->mRedirectsSize = src->mRedirectsSize; | |
501 | - dest->mRedirectsNum = src->mRedirectsNum; | |
502 | - | |
503 | -/* | |
504 | - memcpy(dest->mOptions, src->mOptions, sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
505 | - | |
506 | - for(i=0; i<XYZSH_OPTION_MAX; i++) { | |
507 | - if(src->mOptions[i].mKey) { dest->mOptions[i].mKey = STRDUP(src->mOptions[i].mKey); } | |
508 | - if(src->mOptions[i].mArg) { dest->mOptions[i].mArg = STRDUP(src->mOptions[i].mArg); } | |
509 | - } | |
510 | -*/ | |
511 | - memset(dest->mOptions, 0, sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
512 | - | |
513 | - if(src->mMessagesNum > 0) { | |
514 | - for(i=0; i<src->mMessagesNum; i++) { | |
515 | - dest->mMessages[i] = STRDUP(src->mMessages[i]); | |
516 | - } | |
517 | - dest->mMessagesNum = src->mMessagesNum; | |
518 | - } | |
519 | - | |
520 | - dest->mRedirectsFileNamesRuntime = NULL; | |
521 | -} | |
522 | - | |
523 | 436 | void sCommand_delete(sCommand* self) |
524 | 437 | { |
525 | 438 | int i; |
@@ -568,59 +481,6 @@ void sCommand_delete(sCommand* self) | ||
568 | 481 | } |
569 | 482 | } |
570 | 483 | |
571 | -void sCommand_delete_malloc(sCommand* self) | |
572 | -{ | |
573 | - int i; | |
574 | - for(i=0; i<self->mArgsNum; i++) { | |
575 | - FREE(self->mArgs[i]); | |
576 | - } | |
577 | - FREE(self->mArgs); | |
578 | - FREE(self->mArgsFlags); | |
579 | - for(i=0; i<self->mArgsNumRuntime; i++) { | |
580 | - FREE(self->mArgsRuntime[i]); | |
581 | - } | |
582 | - FREE(self->mArgsRuntime); | |
583 | - | |
584 | - for(i=0; i<self->mEnvsNum; i++) { | |
585 | - if(self->mEnvs[i].mKind == kEnv) { | |
586 | - FREE(self->mEnvs[i].mName); | |
587 | - FREE(self->mEnvs[i].mKey); | |
588 | - } | |
589 | - else { | |
590 | - block_delete_malloc(self->mEnvs[i].mBlock); | |
591 | - } | |
592 | - } | |
593 | - if(self->mEnvs) FREE(self->mEnvs); | |
594 | - | |
595 | - for(i=0; i<XYZSH_OPTION_MAX; i++) { | |
596 | - if(self->mOptions[i].mKey) { FREE(self->mOptions[i].mKey); } | |
597 | - if(self->mOptions[i].mArg) { FREE(self->mOptions[i].mArg); } | |
598 | - } | |
599 | - for(i=0; i<self->mMessagesNum; i++) { | |
600 | - FREE(self->mMessages[i]); | |
601 | - } | |
602 | - | |
603 | - for(i=0; i<self->mBlocksNum; i++) { | |
604 | - block_delete_malloc(self->mBlocks[i]); | |
605 | - } | |
606 | - if(self->mBlocks) FREE(self->mBlocks); | |
607 | - | |
608 | - if(self->mRedirectsFileNames) { | |
609 | - for(i=0; i<self->mRedirectsNum; i++) { | |
610 | - FREE(self->mRedirectsFileNames[i]); | |
611 | - } | |
612 | - FREE(self->mRedirectsFileNames); | |
613 | - } | |
614 | - if(self->mRedirects) FREE(self->mRedirects); | |
615 | - | |
616 | - if(self->mRedirectsFileNamesRuntime) { | |
617 | - for(i=0; i<self->mRedirectsNum; i++) { | |
618 | - FREE(self->mRedirectsFileNamesRuntime[i]); | |
619 | - } | |
620 | - FREE(self->mRedirectsFileNamesRuntime); | |
621 | - } | |
622 | -} | |
623 | - | |
624 | 484 | void sCommand_view(sCommand* self) |
625 | 485 | { |
626 | 486 | printf("mArgsSize: %d\n", self->mArgsSize); |
@@ -746,26 +606,6 @@ static void sStatment_copy_deeply_stack(sStatment* dest, sStatment* source) | ||
746 | 606 | dest->mFlags = source->mFlags; |
747 | 607 | } |
748 | 608 | |
749 | -static void sStatment_copy_deeply_malloc(sStatment* dest, sStatment* source) | |
750 | -{ | |
751 | - dest->mCommandsNum = source->mCommandsNum; | |
752 | - | |
753 | - int i; | |
754 | - for(i=0; i<source->mCommandsNum; i++) { | |
755 | - sCommand_copy_deeply_malloc(dest->mCommands + i, source->mCommands + i); | |
756 | - } | |
757 | - | |
758 | - if(source->mFName) { | |
759 | - dest->mFName = STRDUP(source->mFName); | |
760 | - } | |
761 | - else { | |
762 | - dest->mFName = NULL; | |
763 | - } | |
764 | - dest->mLine = source->mLine; | |
765 | - | |
766 | - dest->mFlags = source->mFlags; | |
767 | -} | |
768 | - | |
769 | 609 | void sStatment_delete(sStatment* self) |
770 | 610 | { |
771 | 611 | int i; |
@@ -775,15 +615,6 @@ void sStatment_delete(sStatment* self) | ||
775 | 615 | if(self->mFName) FREE(self->mFName); |
776 | 616 | } |
777 | 617 | |
778 | -void sStatment_delete_malloc(sStatment* self) | |
779 | -{ | |
780 | - int i; | |
781 | - for(i=0; i<self->mCommandsNum; i++) { | |
782 | - sCommand_delete_malloc(self->mCommands + i); | |
783 | - } | |
784 | - if(self->mFName) FREE(self->mFName); | |
785 | -} | |
786 | - | |
787 | 618 | void sStatment_view(sStatment* self) |
788 | 619 | { |
789 | 620 | printf("mFlags "); |
@@ -817,34 +648,6 @@ void sStatment_view(sStatment* self) | ||
817 | 648 | } |
818 | 649 | } |
819 | 650 | |
820 | -#ifdef MDEBUG | |
821 | -sObject* block_new_debug_from_malloc(const char* fname, int line, const char* func_name) | |
822 | -{ | |
823 | - sObject* self = (sObject*)CheckMemLeak_Malloc(sizeof(sObject), fname, line, func_name); | |
824 | - | |
825 | - SBLOCK(self).mStatments = MALLOC(sizeof(sStatment)*1); | |
826 | - memset(SBLOCK(self).mStatments, 0, sizeof(sStatment)*1); | |
827 | - SBLOCK(self).mStatmentsNum = 0; | |
828 | - SBLOCK(self).mStatmentsSize = 1; | |
829 | - SBLOCK(self).mSource = NULL; | |
830 | - | |
831 | - return self; | |
832 | -} | |
833 | -#else | |
834 | -sObject* block_new_from_malloc() | |
835 | -{ | |
836 | - sObject* self = MALLOC(sizeof(sObject)); | |
837 | - | |
838 | - SBLOCK(self).mStatments = MALLOC(sizeof(sStatment)*1); | |
839 | - memset(SBLOCK(self).mStatments, 0, sizeof(sStatment)*1); | |
840 | - SBLOCK(self).mStatmentsNum = 0; | |
841 | - SBLOCK(self).mStatmentsSize = 1; | |
842 | - SBLOCK(self).mSource = NULL; | |
843 | - | |
844 | - return self; | |
845 | -} | |
846 | -#endif | |
847 | - | |
848 | 651 | sObject* block_new_from_gc(BOOL user_object) |
849 | 652 | { |
850 | 653 | sObject* self = gc_get_free_object(T_BLOCK, user_object); |
@@ -885,33 +688,6 @@ sObject* block_clone_gc(sObject* source, int type, BOOL user_object) | ||
885 | 688 | return self; |
886 | 689 | } |
887 | 690 | |
888 | -sObject* block_clone_malloc(sObject* source) | |
889 | -{ | |
890 | - sObject* self = MALLOC(sizeof(sObject)); | |
891 | - | |
892 | - const int statments_size = SBLOCK(source).mStatmentsSize; | |
893 | - | |
894 | - SBLOCK(self).mStatments = MALLOC(sizeof(sStatment)*statments_size); | |
895 | - memset(SBLOCK(self).mStatments, 0, sizeof(sStatment)*statments_size); | |
896 | - SBLOCK(self).mStatmentsNum = SBLOCK(source).mStatmentsNum; | |
897 | - SBLOCK(self).mStatmentsSize = statments_size; | |
898 | - if(SBLOCK(source).mSource) { | |
899 | - SBLOCK(self).mSource = STRDUP(SBLOCK(source).mSource); | |
900 | - } | |
901 | - else { | |
902 | - SBLOCK(self).mSource = NULL; | |
903 | - } | |
904 | - SBLOCK(self).mCompletionFlags = SBLOCK(source).mCompletionFlags; | |
905 | - | |
906 | - /// copy contents of all statments | |
907 | - int i; | |
908 | - for(i=0; i<SBLOCK(source).mStatmentsNum; i++) { | |
909 | - sStatment_copy_deeply_malloc(SBLOCK(self).mStatments + i, SBLOCK(source).mStatments + i); | |
910 | - } | |
911 | - | |
912 | - return self; | |
913 | -} | |
914 | - | |
915 | 691 | sObject* block_clone_stack(sObject* source, int type) |
916 | 692 | { |
917 | 693 | sObject* self = stack_get_free_object(type); |
@@ -974,19 +750,6 @@ void block_delete_stack(sObject* self) | ||
974 | 750 | if(SBLOCK(self).mSource) FREE(SBLOCK(self).mSource); |
975 | 751 | } |
976 | 752 | |
977 | -void block_delete_malloc(sObject* self) | |
978 | -{ | |
979 | - int i; | |
980 | - for(i=0; i<SBLOCK(self).mStatmentsNum; i++) { | |
981 | - sStatment_delete_malloc(SBLOCK(self).mStatments + i); | |
982 | - } | |
983 | - FREE(SBLOCK(self).mStatments); | |
984 | - | |
985 | - if(SBLOCK(self).mSource) FREE(SBLOCK(self).mSource); | |
986 | - | |
987 | - FREE(self); | |
988 | -} | |
989 | - | |
990 | 753 | ////////////////////////////////////////////////////////////////////////// |
991 | 754 | // some functions |
992 | 755 | ///////////////////////////////////////////////////////////////////////// |
@@ -1407,6 +1170,7 @@ BOOL sCommand_expand_env(sCommand* command, sObject* fun, sObject* nextin, sObje | ||
1407 | 1170 | char** tails; |
1408 | 1171 | if(!expand_glob(expanded_str, ALLOC &head, ALLOC &tails, command, runinfo->mSName, runinfo->mSLine)) |
1409 | 1172 | { |
1173 | + FREE(expanded_str); | |
1410 | 1174 | return FALSE; |
1411 | 1175 | } |
1412 | 1176 | sCommand_add_arg_to_command2(command, MANAGED head); |
@@ -1417,6 +1181,8 @@ BOOL sCommand_expand_env(sCommand* command, sObject* fun, sObject* nextin, sObje | ||
1417 | 1181 | } |
1418 | 1182 | FREE(tails); |
1419 | 1183 | } |
1184 | + | |
1185 | + FREE(expanded_str); | |
1420 | 1186 | } |
1421 | 1187 | else { |
1422 | 1188 | char* expanded_str; |
@@ -1498,6 +1264,8 @@ BOOL sCommand_expand_env_redirect(sCommand* command, sObject* nextin, sRunInfo* | ||
1498 | 1264 | p++; |
1499 | 1265 | } |
1500 | 1266 | FREE(tails); |
1267 | + | |
1268 | + FREE(expanded_str); | |
1501 | 1269 | } |
1502 | 1270 | else { |
1503 | 1271 | command->mRedirectsFileNamesRuntime[i] = MANAGED expanded_str; |
@@ -486,7 +486,7 @@ BOOL cmd_msleep(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
486 | 486 | sCommand* command = runinfo->mCommand; |
487 | 487 | |
488 | 488 | if(command->mArgsNumRuntime == 2) { |
489 | - /// スミホマ /// | |
489 | + /// ホゥ窶毒椎 /// | |
490 | 490 | char c [] = {'.', 'o', 'O'}; |
491 | 491 | int n = atoi(command->mArgsRuntime[1]); |
492 | 492 | int i; |
@@ -815,7 +815,7 @@ BOOL cmd_prompt(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
815 | 815 | sCommand* command = runinfo->mCommand; |
816 | 816 | if(command->mBlocksNum == 1) { |
817 | 817 | gPrompt = block_clone_gc(command->mBlocks[0], T_BLOCK, FALSE); |
818 | - uobject_put(gxyzshObject, "_prompt", gPrompt); | |
818 | + uobject_put(gXyzshObject, "_prompt", gPrompt); | |
819 | 819 | runinfo->mRCode = 0; |
820 | 820 | } |
821 | 821 |
@@ -410,8 +410,8 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
410 | 410 | char* result = NULL; |
411 | 411 | if(sCommand_option_item(command, "-ignore-case")) { |
412 | 412 | while(p < start_byte + strlen(start_byte)) { |
413 | - if(gxyzshSigInt) { | |
414 | - gxyzshSigInt = FALSE; | |
413 | + if(gXyzshSigInt) { | |
414 | + gXyzshSigInt = FALSE; | |
415 | 415 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
416 | 416 | runinfo->mRCode = RCODE_SIGNAL_INTERRUPT; |
417 | 417 | return FALSE; |
@@ -432,8 +432,8 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
432 | 432 | } |
433 | 433 | else { |
434 | 434 | while(p < start_byte + strlen(start_byte)) { |
435 | - if(gxyzshSigInt) { | |
436 | - gxyzshSigInt = FALSE; | |
435 | + if(gXyzshSigInt) { | |
436 | + gXyzshSigInt = FALSE; | |
437 | 437 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
438 | 438 | runinfo->mRCode = RCODE_SIGNAL_INTERRUPT; |
439 | 439 | return FALSE; |
@@ -471,7 +471,7 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
471 | 471 | } |
472 | 472 | } |
473 | 473 | |
474 | - /// スミホマ /// | |
474 | + /// ホゥ窶毒椎 /// | |
475 | 475 | if(!sCommand_option_item(command, "-quiet")) { |
476 | 476 | if(!fd_write(nextout, msg, size)) { |
477 | 477 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
@@ -503,9 +503,9 @@ static char* strstr_back(char* p, char* start, char* word, char* sname, int slin | ||
503 | 503 | break; |
504 | 504 | } |
505 | 505 | |
506 | - if(gxyzshSigInt) { | |
506 | + if(gXyzshSigInt) { | |
507 | 507 | err_msg("interrupt", sname, sline, command); |
508 | - gxyzshSigInt = FALSE; | |
508 | + gXyzshSigInt = FALSE; | |
509 | 509 | return NULL; |
510 | 510 | } |
511 | 511 | } |
@@ -542,8 +542,8 @@ static char* strcasestr_back(char* p, char* start, char* word, char* sname, int | ||
542 | 542 | } |
543 | 543 | } |
544 | 544 | |
545 | - if(gxyzshSigInt) { | |
546 | - gxyzshSigInt = FALSE; | |
545 | + if(gXyzshSigInt) { | |
546 | + gXyzshSigInt = FALSE; | |
547 | 547 | err_msg("interrupt", sname, sline, command); |
548 | 548 | return NULL; |
549 | 549 | } |
@@ -629,8 +629,8 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
629 | 629 | while(p>=target) { |
630 | 630 | result = strcasestr_back(p, target, word, runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
631 | 631 | |
632 | - if(gxyzshSigInt) { | |
633 | - gxyzshSigInt = FALSE; | |
632 | + if(gXyzshSigInt) { | |
633 | + gXyzshSigInt = FALSE; | |
634 | 634 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
635 | 635 | runinfo->mRCode = RCODE_SIGNAL_INTERRUPT; |
636 | 636 | return FALSE; |
@@ -652,8 +652,8 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
652 | 652 | while(p>=target) { |
653 | 653 | result = strstr_back(p, target, word, runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
654 | 654 | |
655 | - if(gxyzshSigInt) { | |
656 | - gxyzshSigInt = FALSE; | |
655 | + if(gXyzshSigInt) { | |
656 | + gXyzshSigInt = FALSE; | |
657 | 657 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
658 | 658 | runinfo->mRCode = RCODE_SIGNAL_INTERRUPT; |
659 | 659 | return FALSE; |
@@ -690,7 +690,7 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
690 | 690 | } |
691 | 691 | } |
692 | 692 | |
693 | - /// スミホマ /// | |
693 | + /// ホゥ窶毒椎 /// | |
694 | 694 | if(!sCommand_option_item(command, "-quiet")) { |
695 | 695 | if(!fd_write(nextout, msg, size)) { |
696 | 696 | err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]); |
@@ -0,0 +1,32 @@ | ||
1 | +#include "config.h" | |
2 | +#include "xyzsh/xyzsh.h" | |
3 | +#include <string.h> | |
4 | +#include <stdio.h> | |
5 | + | |
6 | +sObject* external_prog_new_from_gc(char* path, BOOL user_object) | |
7 | +{ | |
8 | + sObject* self = gc_get_free_object(T_EXTPROG, user_object); | |
9 | + | |
10 | + SEXTPROG(self).mPath = STRDUP(path); | |
11 | + | |
12 | + return self; | |
13 | +} | |
14 | + | |
15 | +void external_prog_delete_gc(sObject* self) | |
16 | +{ | |
17 | + FREE(SEXTPROG(self).mPath); | |
18 | +} | |
19 | + | |
20 | +sObject* extobj_new_from_gc(void* object, fExtObjMarkFun mark_fun, fExtObjFreeFun free_fun, fExtObjMainFun main_fun, BOOL user_object) | |
21 | +{ | |
22 | + sObject* self = gc_get_free_object(T_EXTOBJ, user_object); | |
23 | + | |
24 | + SEXTOBJ(self).mObject = object; | |
25 | + SEXTOBJ(self).mMarkFun = mark_fun; | |
26 | + SEXTOBJ(self).mFreeFun = free_fun; | |
27 | + SEXTOBJ(self).mMainFun = main_fun; | |
28 | + | |
29 | + return self; | |
30 | +} | |
31 | + | |
32 | + |
@@ -0,0 +1,339 @@ | ||
1 | +#include "config.h" | |
2 | +#include "xyzsh/xyzsh.h" | |
3 | +#include <string.h> | |
4 | +#include <stdio.h> | |
5 | +#include <errno.h> | |
6 | + | |
7 | +sObject* fd_new_from_stack(int kind, int fd) | |
8 | +{ | |
9 | + sObject* self = stack_get_free_object(T_FD); | |
10 | + | |
11 | + SFD(self).mKind = kind; | |
12 | + | |
13 | + if(kind == kFDKindFD) { | |
14 | + SFD(self).fd.mFD = fd; | |
15 | + } | |
16 | + else { | |
17 | + SFD(self).fdbuf.mBuf = MALLOC(1024); | |
18 | + SFD(self).fdbuf.mBuf[0] = 0; | |
19 | + | |
20 | + SFD(self).fdbuf.mBufSize = 1024; | |
21 | + SFD(self).fdbuf.mBufLen = 0; | |
22 | + | |
23 | + SFD(self).fdbuf.mLines = VECTOR_NEW_MALLOC(32); | |
24 | + SFD(self).fdbuf.mReadedLineNumber = 0; | |
25 | + } | |
26 | + | |
27 | + return self; | |
28 | +} | |
29 | + | |
30 | +void fd_delete_stack(sObject* self) | |
31 | +{ | |
32 | + if(SFD(self).mKind == kFDKindBuf) { | |
33 | + sObject* v = SFD(self).fdbuf.mLines; | |
34 | + int i; | |
35 | + for(i=0; i<vector_count(v); i++) { | |
36 | + FREE(vector_item(v, i)); | |
37 | + } | |
38 | + vector_delete_malloc(SFD(self).fdbuf.mLines); | |
39 | + | |
40 | + FREE(SFD(self).fdbuf.mBuf); | |
41 | + } | |
42 | +} | |
43 | + | |
44 | +// TRUE: Success | |
45 | +// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
46 | +BOOL bufsiz_write(int fd, char* buf, int buf_size) | |
47 | +{ | |
48 | + char* p = buf; | |
49 | + while(p - buf < buf_size) { | |
50 | + int size; | |
51 | + if(buf_size - (p - buf) < BUFSIZ) { | |
52 | + size = buf_size - (p-buf); | |
53 | + } | |
54 | + else { | |
55 | + size = BUFSIZ; | |
56 | + } | |
57 | + | |
58 | + if(write(fd, p, size) < 0) { | |
59 | + if(errno == EINTR) { | |
60 | + while(!gXyzshSigInt); | |
61 | + gXyzshSigInt = FALSE; | |
62 | + return FALSE; | |
63 | + } | |
64 | + return FALSE; | |
65 | + } | |
66 | + | |
67 | + if(gXyzshSigInt) { | |
68 | + gXyzshSigInt = FALSE; | |
69 | + return FALSE; | |
70 | + } | |
71 | + | |
72 | + p+=size; | |
73 | + } | |
74 | + | |
75 | + return TRUE; | |
76 | +} | |
77 | + | |
78 | +BOOL fd_guess_lf(sObject* self, enum eLineField* lf) | |
79 | +{ | |
80 | + *lf = -1; | |
81 | + char* p = SFD(self).fdbuf.mBuf; | |
82 | + | |
83 | + while(*p) { | |
84 | + if(*p == '\a') { | |
85 | + *lf = kBel; | |
86 | + return TRUE; | |
87 | + } | |
88 | + else { | |
89 | + p++; | |
90 | + } | |
91 | + } | |
92 | + | |
93 | + if(*lf == -1) { | |
94 | + p = SFD(self).fdbuf.mBuf; | |
95 | + | |
96 | + while(*p) { | |
97 | + if(*p == '\r' && *(p+1) == '\n') { | |
98 | + *lf = kCRLF; | |
99 | + return TRUE; | |
100 | + } | |
101 | + else { | |
102 | + p++; | |
103 | + } | |
104 | + } | |
105 | + } | |
106 | + | |
107 | + if(*lf == -1) { | |
108 | + p = SFD(self).fdbuf.mBuf; | |
109 | + | |
110 | + while(*p) { | |
111 | + if(*p == '\r') { | |
112 | + *lf = kCR; | |
113 | + return TRUE; | |
114 | + } | |
115 | + else { | |
116 | + p++; | |
117 | + } | |
118 | + } | |
119 | + } | |
120 | + | |
121 | + if(*lf == -1) { | |
122 | + p = SFD(self).fdbuf.mBuf; | |
123 | + | |
124 | + while(*p) { | |
125 | + if(*p == '\n') { | |
126 | + *lf = kLF; | |
127 | + return TRUE; | |
128 | + } | |
129 | + else { | |
130 | + p++; | |
131 | + } | |
132 | + } | |
133 | + } | |
134 | + | |
135 | + return FALSE; | |
136 | +} | |
137 | + | |
138 | +void fd_split(sObject* self, enum eLineField lf) | |
139 | +{ | |
140 | + assert(TYPE(self) == T_FD && SFD(self).mKind == kFDKindBuf); | |
141 | + | |
142 | + sObject* v = SFD(self).fdbuf.mLines; | |
143 | + | |
144 | + if(SFD(self).fdbuf.mLinesLineField != lf) { | |
145 | + int i; | |
146 | + for(i=0; i<vector_count(v); i++) { | |
147 | + FREE(vector_item(v, i)); | |
148 | + } | |
149 | + vector_clear(v); | |
150 | + SFD(self).fdbuf.mReadedLineNumber = 0; | |
151 | + } | |
152 | + | |
153 | + if(vector_count(v) == 0) { | |
154 | + char* p = SFD(self).fdbuf.mBuf; | |
155 | + char* new_line = p; | |
156 | + if(lf == kCRLF) { | |
157 | + while(1) { | |
158 | + if(*p == '\r' && *(p+1) == '\n') { | |
159 | + p+=2; | |
160 | + const int size = p - new_line; | |
161 | + char* line = MALLOC(size + 1); | |
162 | + memcpy(line, new_line, size); | |
163 | + line[size] = 0; | |
164 | + vector_add(v, line); | |
165 | + new_line = p; | |
166 | + } | |
167 | + else if(p - SFD(self).fdbuf.mBuf >= SFD(self).fdbuf.mBufLen) { | |
168 | + const int size = p - new_line; | |
169 | + if(size > 0) { | |
170 | + char* line = MALLOC(size + 1 + 2); | |
171 | + memcpy(line, new_line, size); | |
172 | + line[size] = '\r'; | |
173 | + line[size+1] = '\n'; | |
174 | + line[size+2] = 0; | |
175 | + vector_add(v, line); | |
176 | + } | |
177 | + break; | |
178 | + } | |
179 | + else { | |
180 | + p++; | |
181 | + } | |
182 | + } | |
183 | + } | |
184 | + else { | |
185 | + char split_char; | |
186 | + if(lf == kLF) { | |
187 | + split_char = '\n'; | |
188 | + } | |
189 | + else if(lf == kCR) { | |
190 | + split_char = '\r'; | |
191 | + } | |
192 | + else { | |
193 | + split_char = '\a'; | |
194 | + } | |
195 | + | |
196 | + while(1) { | |
197 | + if(*p == split_char) { | |
198 | + const int size = p - new_line + 1; | |
199 | + char* line = MALLOC(size + 1); | |
200 | + memcpy(line, new_line, size); | |
201 | + line[size] = 0; | |
202 | + vector_add(v, line); | |
203 | + p++; | |
204 | + new_line = p; | |
205 | + } | |
206 | + else if(p - SFD(self).fdbuf.mBuf >= SFD(self).fdbuf.mBufLen) { | |
207 | + const int size = p - new_line; | |
208 | + if(size > 0) { | |
209 | + char* line = MALLOC(size + 1 + 1); | |
210 | + memcpy(line, new_line, size); | |
211 | + line[size] = split_char; | |
212 | + line[size+1] = 0; | |
213 | + vector_add(v, line); | |
214 | + } | |
215 | + break; | |
216 | + } | |
217 | + else { | |
218 | + p++; | |
219 | + } | |
220 | + } | |
221 | + } | |
222 | + | |
223 | + SFD(self).fdbuf.mLinesLineField = lf; | |
224 | + } | |
225 | +} | |
226 | + | |
227 | +// TRUE: Success | |
228 | +// FALSE: signal interrupt | |
229 | +static BOOL memcpy_buf(char* dest, char* src, size_t size) | |
230 | +{ | |
231 | + char* p = dest; | |
232 | + char* p2 = src; | |
233 | + while(1) { | |
234 | + if(gXyzshSigInt) { | |
235 | + gXyzshSigInt = FALSE; | |
236 | + return FALSE; | |
237 | + } | |
238 | + if(size - (p - dest) < BUFSIZ) { | |
239 | + memcpy(p, p2, size - (p-dest)); | |
240 | + break; | |
241 | + } | |
242 | + else { | |
243 | + memcpy(p, p2, BUFSIZ); | |
244 | + p+=BUFSIZ; | |
245 | + p2+=BUFSIZ; | |
246 | + } | |
247 | + } | |
248 | + | |
249 | + return TRUE; | |
250 | +} | |
251 | + | |
252 | +void fd_clear(sObject* self) | |
253 | +{ | |
254 | + assert(TYPE(self) == T_FD); | |
255 | + | |
256 | + if(SFD(self).mKind == kFDKindBuf) { | |
257 | + SFD(self).fdbuf.mBufLen = 0; | |
258 | + SFD(self).fdbuf.mBuf[0] = 0; | |
259 | + | |
260 | + int i; | |
261 | + for(i=0; i<vector_count(SFD(self).fdbuf.mLines); i++) { | |
262 | + FREE(vector_item(SFD(self).fdbuf.mLines, i)); | |
263 | + } | |
264 | + vector_clear(SFD(self).fdbuf.mLines); | |
265 | + SFD(self).fdbuf.mReadedLineNumber = 0; | |
266 | + } | |
267 | +} | |
268 | + | |
269 | +// TRUE: Success | |
270 | +// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
271 | +BOOL fd_write(sObject* self, char* str, int len) | |
272 | +{ | |
273 | + if(SFD(self).mKind == kFDKindFD) { | |
274 | + if(write(SFD(self).fd.mFD, str, len) < 0) { | |
275 | + return FALSE; | |
276 | + } | |
277 | + } | |
278 | + else { | |
279 | + if((SFD(self).fdbuf.mBufLen+len+1) >= SFD(self).fdbuf.mBufSize) { | |
280 | + int new_size = (SFD(self).fdbuf.mBufSize + len+1) * 1.8; | |
281 | + | |
282 | + SFD(self).fdbuf.mBuf = REALLOC(SFD(self).fdbuf.mBuf, new_size); | |
283 | + SFD(self).fdbuf.mBufSize = new_size; | |
284 | + } | |
285 | + | |
286 | + | |
287 | + if(!memcpy_buf(SFD(self).fdbuf.mBuf + SFD(self).fdbuf.mBufLen, str, len)) { | |
288 | + return FALSE; | |
289 | + } | |
290 | + SFD(self).fdbuf.mBufLen += len; | |
291 | + SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen] = 0; | |
292 | + } | |
293 | + | |
294 | + return TRUE; | |
295 | +} | |
296 | + | |
297 | +// TRUE: Success | |
298 | +// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
299 | +BOOL fd_writec(sObject* self, char c) | |
300 | +{ | |
301 | + if(SFD(self).mKind == kFDKindFD) { | |
302 | + if(write(SFD(self).fd.mFD, &c, 1) < 0) { | |
303 | + return FALSE; | |
304 | + } | |
305 | + } | |
306 | + else { | |
307 | + if((SFD(self).fdbuf.mBufLen) >= SFD(self).fdbuf.mBufSize) { | |
308 | + int new_size = (SFD(self).fdbuf.mBufSize) * 1.8; | |
309 | + SFD(self).fdbuf.mBuf = REALLOC(SFD(self).fdbuf.mBuf, new_size); | |
310 | + SFD(self).fdbuf.mBufSize = new_size; | |
311 | + } | |
312 | + | |
313 | + SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen++] = c; | |
314 | + SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen] = 0; | |
315 | + | |
316 | + if(gXyzshSigInt) { | |
317 | + gXyzshSigInt = FALSE; | |
318 | + return FALSE; | |
319 | + } | |
320 | + } | |
321 | + | |
322 | + return TRUE; | |
323 | +} | |
324 | + | |
325 | +// TRUE: Success | |
326 | +// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
327 | +BOOL fd_flash(sObject* self, int fd) | |
328 | +{ | |
329 | + if(SFD(self).mKind == kFDKindBuf) { | |
330 | + if(!bufsiz_write(fd, SFD(self).fdbuf.mBuf, SFD(self).fdbuf.mBufLen)) { | |
331 | + return FALSE; | |
332 | + } | |
333 | + | |
334 | + SFD(self).fdbuf.mBufLen = 0; | |
335 | + SFD(self).fdbuf.mBuf[0] = 0; | |
336 | + } | |
337 | + | |
338 | + return TRUE; | |
339 | +} |
@@ -11,7 +11,7 @@ static sObject** gPool; | ||
11 | 11 | static sObject* gFreeObjectHead; |
12 | 12 | sObject* gRootObject; |
13 | 13 | sObject* gCompletionObject; |
14 | -sObject* gxyzshObject; | |
14 | +sObject* gXyzshObject; | |
15 | 15 | sObject* gCurrentObject; |
16 | 16 | sObject* gMemChecker; |
17 | 17 | sObject* gStackFrames; |
@@ -203,21 +203,20 @@ void gc_init(int pool_size) | ||
203 | 203 | |
204 | 204 | uobject_put(gRootObject, "compl", gCompletionObject); |
205 | 205 | |
206 | - gxyzshObject = UOBJECT_NEW_GC(8, NULL, "xyzsh", FALSE); | |
206 | + gXyzshObject = UOBJECT_NEW_GC(8, NULL, "xyzsh", FALSE); | |
207 | 207 | gStackFrames = VECTOR_NEW_GC(8, FALSE); |
208 | - uobject_put(gxyzshObject, "_stackframes", gStackFrames); | |
208 | + uobject_put(gXyzshObject, "_stackframes", gStackFrames); | |
209 | 209 | } |
210 | 210 | |
211 | 211 | void gc_final() |
212 | 212 | { |
213 | 213 | /// sweep all user objects /// |
214 | 214 | uobject_clear(gRootObject); |
215 | - uobject_clear(gxyzshObject); | |
215 | + uobject_clear(gXyzshObject); | |
216 | 216 | if(gAppType == kATConsoleApp) { |
217 | 217 | printf("sweeped %d objects...\n", gc_sweep()); |
218 | 218 | } |
219 | 219 | |
220 | - /// delete container /// | |
221 | 220 | int i; |
222 | 221 | for(i=0; i<gPoolSize; i++) { |
223 | 222 | sObject* p = gPool[i]; |
@@ -232,42 +231,6 @@ void gc_final() | ||
232 | 231 | FREE(gPool); |
233 | 232 | } |
234 | 233 | |
235 | -/* | |
236 | -static int mark_objects_in_pipe(sObject* current_pipe) | |
237 | -{ | |
238 | - assert(TYPE(current_pipe) == T_FD); | |
239 | - | |
240 | - int count = 0; | |
241 | - | |
242 | - enum eLineField lf; | |
243 | - if(fd_guess_lf(current_pipe, &lf)) { | |
244 | - fd_split(current_pipe, lf); | |
245 | - } | |
246 | - else { | |
247 | - fd_split(current_pipe, kLF); | |
248 | - } | |
249 | - | |
250 | - int i; | |
251 | - for(i=0; i<vector_count(SFD(current_pipe).fdbuf.mLines); i++) { | |
252 | - char* line = vector_item(SFD(current_pipe).fdbuf.mLines, i); | |
253 | - void* mem = (void*)(unsigned long)strtoll(line, NULL, 16); | |
254 | - | |
255 | - int type = memchecker_item(gMemChecker, mem); | |
256 | - | |
257 | - if(type >= 0) { | |
258 | - sObject* obj = mem; | |
259 | - | |
260 | - obj->mFlg |= GC_MARK; | |
261 | - count++; | |
262 | - | |
263 | - count += object_gc_children_mark(obj); | |
264 | - } | |
265 | - } | |
266 | - | |
267 | - return count; | |
268 | -} | |
269 | -*/ | |
270 | - | |
271 | 234 | static int mark() |
272 | 235 | { |
273 | 236 | int i; |
@@ -284,8 +247,8 @@ static int mark() | ||
284 | 247 | gRootObject->mFlg |= GC_MARK; |
285 | 248 | int count = uobject_gc_children_mark(gRootObject); |
286 | 249 | |
287 | - gxyzshObject->mFlg |= GC_MARK; | |
288 | - count += uobject_gc_children_mark(gxyzshObject); | |
250 | + gXyzshObject->mFlg |= GC_MARK; | |
251 | + count += uobject_gc_children_mark(gXyzshObject); | |
289 | 252 | |
290 | 253 | return count; |
291 | 254 | } |
@@ -1,7 +1,6 @@ | ||
1 | 1 | #include "config.h" |
2 | 2 | #include <stdio.h> |
3 | 3 | #include <string.h> |
4 | -#include <assert.h> | |
5 | 4 | #include "xyzsh/xyzsh.h" |
6 | 5 | |
7 | 6 | hash_it* hash_it_new(char* key, void* item, hash_it* coll_it, hash_it* next_it, sObject* hash) |
@@ -93,7 +92,8 @@ sObject* hash_new_from_stack(int size) | ||
93 | 92 | |
94 | 93 | void hash_delete_gc(sObject* self) |
95 | 94 | { |
96 | - assert(TYPE(self) == T_HASH); | |
95 | + ASSERT(TYPE(self) == T_HASH); | |
96 | + | |
97 | 97 | hash_it* it = SHASH(self).mEntryIt; |
98 | 98 | |
99 | 99 | while(it) { |
@@ -107,7 +107,8 @@ void hash_delete_gc(sObject* self) | ||
107 | 107 | |
108 | 108 | void hash_delete_stack(sObject* self) |
109 | 109 | { |
110 | - assert(TYPE(self) == T_HASH); | |
110 | + ASSERT(TYPE(self) == T_HASH); | |
111 | + | |
111 | 112 | hash_it* it = SHASH(self).mEntryIt; |
112 | 113 | |
113 | 114 | while(it) { |
@@ -121,7 +122,8 @@ void hash_delete_stack(sObject* self) | ||
121 | 122 | |
122 | 123 | void hash_delete_malloc(sObject* self) |
123 | 124 | { |
124 | - assert(TYPE(self) == T_HASH); | |
125 | + ASSERT(TYPE(self) == T_HASH); | |
126 | + | |
125 | 127 | hash_it* it = SHASH(self).mEntryIt; |
126 | 128 | |
127 | 129 | while(it) { |
@@ -137,7 +139,7 @@ void hash_delete_malloc(sObject* self) | ||
137 | 139 | |
138 | 140 | static unsigned int get_hash_value(sObject* self, char* key) |
139 | 141 | { |
140 | - assert(TYPE(self) == T_HASH); | |
142 | + ASSERT(TYPE(self) == T_HASH); | |
141 | 143 | |
142 | 144 | unsigned int i = 0; |
143 | 145 | while(*key) { |
@@ -150,7 +152,8 @@ static unsigned int get_hash_value(sObject* self, char* key) | ||
150 | 152 | |
151 | 153 | static void resize(sObject* self) |
152 | 154 | { |
153 | - assert(TYPE(self) == T_HASH); | |
155 | + ASSERT(TYPE(self) == T_HASH); | |
156 | + | |
154 | 157 | const int table_size = SHASH(self).mTableSize; |
155 | 158 | |
156 | 159 | SHASH(self).mTableSize *= 5; |
@@ -172,7 +175,7 @@ static void resize(sObject* self) | ||
172 | 175 | |
173 | 176 | void hash_put(sObject* self, char* key, void* item) |
174 | 177 | { |
175 | - assert(TYPE(self) == T_HASH); | |
178 | + ASSERT(TYPE(self) == T_HASH); | |
176 | 179 | |
177 | 180 | if(SHASH(self).mCounter >= SHASH(self).mTableSize) { |
178 | 181 | resize(self); |
@@ -199,7 +202,8 @@ void hash_put(sObject* self, char* key, void* item) | ||
199 | 202 | |
200 | 203 | static void erase_from_list(sObject* self, hash_it* rit) |
201 | 204 | { |
202 | - assert(TYPE(self) == T_HASH); | |
205 | + ASSERT(TYPE(self) == T_HASH); | |
206 | + | |
203 | 207 | if(rit == SHASH(self).mEntryIt) { |
204 | 208 | SHASH(self).mEntryIt = rit->mNextIt; |
205 | 209 | } |
@@ -219,7 +223,8 @@ static void erase_from_list(sObject* self, hash_it* rit) | ||
219 | 223 | |
220 | 224 | BOOL hash_erase(sObject* self, char* key) |
221 | 225 | { |
222 | - assert(TYPE(self) == T_HASH); | |
226 | + ASSERT(TYPE(self) == T_HASH); | |
227 | + | |
223 | 228 | const unsigned int hash_value = get_hash_value(self, key); |
224 | 229 | hash_it* it = SHASH(self).mTable[hash_value]; |
225 | 230 |
@@ -260,7 +265,8 @@ BOOL hash_erase(sObject* self, char* key) | ||
260 | 265 | |
261 | 266 | void hash_clear(sObject* self) |
262 | 267 | { |
263 | - assert(TYPE(self) == T_HASH); | |
268 | + ASSERT(TYPE(self) == T_HASH); | |
269 | + | |
264 | 270 | int i; |
265 | 271 | int max; |
266 | 272 | hash_it* it = SHASH(self).mEntryIt; |
@@ -279,7 +285,8 @@ void hash_clear(sObject* self) | ||
279 | 285 | |
280 | 286 | void hash_replace(sObject* self, char* key, void* item) |
281 | 287 | { |
282 | - assert(TYPE(self) == T_HASH); | |
288 | + ASSERT(TYPE(self) == T_HASH); | |
289 | + | |
283 | 290 | hash_it* it = SHASH(self).mTable[get_hash_value(self, key)]; |
284 | 291 | |
285 | 292 | if(it) { |
@@ -296,7 +303,7 @@ void hash_replace(sObject* self, char* key, void* item) | ||
296 | 303 | |
297 | 304 | void hash_show(sObject* self, char* fname) |
298 | 305 | { |
299 | - assert(TYPE(self) == T_HASH); | |
306 | + ASSERT(TYPE(self) == T_HASH); | |
300 | 307 | |
301 | 308 | char tmp[8096]; |
302 | 309 | int i; |
@@ -333,7 +340,7 @@ void hash_show(sObject* self, char* fname) | ||
333 | 340 | |
334 | 341 | void* hash_item(sObject* self, char* key) |
335 | 342 | { |
336 | - assert(TYPE(self) == T_HASH); | |
343 | + ASSERT(TYPE(self) == T_HASH); | |
337 | 344 | |
338 | 345 | hash_it* it = SHASH(self).mTable[ get_hash_value(self, key) ]; |
339 | 346 |
@@ -347,7 +354,7 @@ void* hash_item(sObject* self, char* key) | ||
347 | 354 | |
348 | 355 | void* hash_item_addr(sObject* self, char* key) |
349 | 356 | { |
350 | - assert(TYPE(self) == T_HASH); | |
357 | + ASSERT(TYPE(self) == T_HASH); | |
351 | 358 | |
352 | 359 | hash_it* it = SHASH(self).mTable[ get_hash_value(self, key) ]; |
353 | 360 | while(it) { |
@@ -360,7 +367,7 @@ void* hash_item_addr(sObject* self, char* key) | ||
360 | 367 | |
361 | 368 | char* hash_key(sObject* self, void* item) |
362 | 369 | { |
363 | - assert(TYPE(self) == T_HASH); | |
370 | + ASSERT(TYPE(self) == T_HASH); | |
364 | 371 | |
365 | 372 | hash_it* it = SHASH(self).mEntryIt; |
366 | 373 |
@@ -374,14 +381,14 @@ char* hash_key(sObject* self, void* item) | ||
374 | 381 | |
375 | 382 | int hash_count(sObject* self) |
376 | 383 | { |
377 | - assert(TYPE(self) == T_HASH); | |
384 | + ASSERT(TYPE(self) == T_HASH); | |
378 | 385 | |
379 | 386 | return SHASH(self).mCounter; |
380 | 387 | } |
381 | 388 | |
382 | 389 | hash_it* hash_loop_begin(sObject* self) |
383 | 390 | { |
384 | - assert(TYPE(self) == T_HASH); | |
391 | + ASSERT(TYPE(self) == T_HASH); | |
385 | 392 | |
386 | 393 | return SHASH(self).mEntryIt; |
387 | 394 | } |
@@ -403,7 +410,7 @@ hash_it* hash_loop_next(hash_it* it) | ||
403 | 410 | |
404 | 411 | int hash_gc_children_mark(sObject* self) |
405 | 412 | { |
406 | - assert(TYPE(self) == T_HASH); | |
413 | + ASSERT(TYPE(self) == T_HASH); | |
407 | 414 | |
408 | 415 | int count = 0; |
409 | 416 |
@@ -63,7 +63,7 @@ static char* prompt() | ||
63 | 63 | xyzsh_set_signal(); |
64 | 64 | |
65 | 65 | sObject* fun = FUN_NEW_STACK(NULL); |
66 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
66 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
67 | 67 | vector_add(gStackFrames, stackframe); |
68 | 68 | //uobject_init(stackframe); |
69 | 69 | SFUN(fun).mLocalObjects = stackframe; |
@@ -109,7 +109,7 @@ BOOL xyzsh_run(int* rcode, sObject* block, char* source_name, fXyzshJobDone xyzs | ||
109 | 109 | xyzsh_set_signal(); |
110 | 110 | |
111 | 111 | sObject* fun = FUN_NEW_STACK(NULL); |
112 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
112 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
113 | 113 | vector_add(gStackFrames, stackframe); |
114 | 114 | //uobject_init(stackframe); |
115 | 115 | SFUN(fun).mLocalObjects = stackframe; |
@@ -269,7 +269,7 @@ BOOL xyzsh_readline_interface_onetime(int* rcode, char* cmdline, int cursor_poin | ||
269 | 269 | xyzsh_set_signal(); |
270 | 270 | |
271 | 271 | sObject* fun = FUN_NEW_STACK(NULL); |
272 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
272 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
273 | 273 | vector_add(gStackFrames, stackframe); |
274 | 274 | //uobject_init(stackframe); |
275 | 275 | SFUN(fun).mLocalObjects = stackframe; |
@@ -429,7 +429,7 @@ void xyzsh_readline_interface(char* cmdline, int cursor_point, char** argv, int | ||
429 | 429 | xyzsh_set_signal(); |
430 | 430 | |
431 | 431 | sObject* fun = FUN_NEW_STACK(NULL); |
432 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
432 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
433 | 433 | vector_add(gStackFrames, stackframe); |
434 | 434 | //uobject_init(stackframe); |
435 | 435 | SFUN(fun).mLocalObjects = stackframe; |
@@ -539,7 +539,7 @@ void xyzsh_opt_c(char* cmd, char** argv, int argc) | ||
539 | 539 | xyzsh_set_signal_optc(); |
540 | 540 | |
541 | 541 | sObject* fun = FUN_NEW_STACK(NULL); |
542 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
542 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
543 | 543 | vector_add(gStackFrames, stackframe); |
544 | 544 | //uobject_init(stackframe); |
545 | 545 | SFUN(fun).mLocalObjects = stackframe; |
@@ -0,0 +1,102 @@ | ||
1 | +#include "config.h" | |
2 | +#include "xyzsh/xyzsh.h" | |
3 | +#include <string.h> | |
4 | +#include <stdio.h> | |
5 | + | |
6 | +sObject* nfun_new_from_gc(fXyzshNativeFun fun, sObject* parent, BOOL user_object) | |
7 | +{ | |
8 | + sObject* self = gc_get_free_object(T_NFUN, user_object); | |
9 | + | |
10 | + SNFUN(self).mNativeFun = fun; | |
11 | + SNFUN(self).mParent = parent; | |
12 | + | |
13 | + SNFUN(self).mOptions = MALLOC(sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
14 | + memset(SNFUN(self).mOptions,0, sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
15 | + | |
16 | + return self; | |
17 | +} | |
18 | + | |
19 | +void nfun_delete_gc(sObject* self) | |
20 | +{ | |
21 | + int i; | |
22 | + for(i=0; i<XYZSH_OPTION_MAX; i++) { | |
23 | + if(SNFUN(self).mOptions[i].mKey) { FREE(SNFUN(self).mOptions[i].mKey); } | |
24 | + if(SNFUN(self).mOptions[i].mArg) { FREE(SNFUN(self).mOptions[i].mArg); } | |
25 | + } | |
26 | + FREE(SNFUN(self).mOptions); | |
27 | +} | |
28 | + | |
29 | +static int options_hash_fun(char* key) | |
30 | +{ | |
31 | + int value = 0; | |
32 | + while(*key) { | |
33 | + value += *key; | |
34 | + key++; | |
35 | + } | |
36 | + return value % XYZSH_OPTION_MAX; | |
37 | +} | |
38 | + | |
39 | +BOOL nfun_put_option_with_argument(sObject* self, MANAGED char* key) | |
40 | +{ | |
41 | + int hash_value = options_hash_fun(key); | |
42 | + | |
43 | + option_hash_it* p = SNFUN(self).mOptions + hash_value; | |
44 | + while(1) { | |
45 | + if(p->mKey) { | |
46 | + p++; | |
47 | + if(p == SNFUN(self).mOptions + hash_value) { | |
48 | + return FALSE; | |
49 | + } | |
50 | + else if(p == SNFUN(self).mOptions + XYZSH_OPTION_MAX) { | |
51 | + p = SNFUN(self).mOptions; | |
52 | + } | |
53 | + } | |
54 | + else { | |
55 | + p->mKey = MANAGED key; | |
56 | + return TRUE; | |
57 | + } | |
58 | + } | |
59 | +} | |
60 | + | |
61 | +BOOL nfun_option_with_argument_item(sObject* self, char* key) | |
62 | +{ | |
63 | + int hash_value = options_hash_fun(key); | |
64 | + option_hash_it* p = SNFUN(self).mOptions + hash_value; | |
65 | + | |
66 | + while(1) { | |
67 | + if(p->mKey) { | |
68 | + if(strcmp(p->mKey, key) == 0) { | |
69 | + return TRUE; | |
70 | + } | |
71 | + else { | |
72 | + p++; | |
73 | + if(p == SNFUN(self).mOptions + hash_value) { | |
74 | + return FALSE; | |
75 | + } | |
76 | + else if(p == SNFUN(self).mOptions + XYZSH_OPTION_MAX) { | |
77 | + p = SNFUN(self).mOptions; | |
78 | + } | |
79 | + } | |
80 | + } | |
81 | + else { | |
82 | + return FALSE; | |
83 | + } | |
84 | + } | |
85 | +} | |
86 | + | |
87 | +int nfun_gc_children_mark(sObject* self) | |
88 | +{ | |
89 | + int count = 0; | |
90 | + | |
91 | + sObject* parent = SNFUN(self).mParent; | |
92 | + if(parent) { | |
93 | + if((parent->mFlg & GC_MARK) == 0) { | |
94 | + parent->mFlg |= GC_MARK; | |
95 | + count++; | |
96 | + count += object_gc_children_mark(parent); | |
97 | + } | |
98 | + } | |
99 | + | |
100 | + return count; | |
101 | +} | |
102 | + |
@@ -3,103 +3,6 @@ | ||
3 | 3 | #include <string.h> |
4 | 4 | #include <stdio.h> |
5 | 5 | |
6 | -sObject* nfun_new_from_gc(fXyzshNativeFun fun, sObject* parent, BOOL user_object) | |
7 | -{ | |
8 | - sObject* self = gc_get_free_object(T_NFUN, user_object); | |
9 | - | |
10 | - SNFUN(self).mNativeFun = fun; | |
11 | - SNFUN(self).mParent = parent; | |
12 | - | |
13 | - SNFUN(self).mOptions = MALLOC(sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
14 | - memset(SNFUN(self).mOptions,0, sizeof(option_hash_it)*XYZSH_OPTION_MAX); | |
15 | - | |
16 | - return self; | |
17 | -} | |
18 | - | |
19 | -void nfun_delete_gc(sObject* self) | |
20 | -{ | |
21 | - int i; | |
22 | - for(i=0; i<XYZSH_OPTION_MAX; i++) { | |
23 | - if(SNFUN(self).mOptions[i].mKey) { FREE(SNFUN(self).mOptions[i].mKey); } | |
24 | - if(SNFUN(self).mOptions[i].mArg) { FREE(SNFUN(self).mOptions[i].mArg); } | |
25 | - } | |
26 | - FREE(SNFUN(self).mOptions); | |
27 | -} | |
28 | - | |
29 | -static int options_hash_fun(char* key) | |
30 | -{ | |
31 | - int value = 0; | |
32 | - while(*key) { | |
33 | - value += *key; | |
34 | - key++; | |
35 | - } | |
36 | - return value % XYZSH_OPTION_MAX; | |
37 | -} | |
38 | - | |
39 | -BOOL nfun_put_option_with_argument(sObject* self, MANAGED char* key) | |
40 | -{ | |
41 | - int hash_value = options_hash_fun(key); | |
42 | - | |
43 | - option_hash_it* p = SNFUN(self).mOptions + hash_value; | |
44 | - while(1) { | |
45 | - if(p->mKey) { | |
46 | - p++; | |
47 | - if(p == SNFUN(self).mOptions + hash_value) { | |
48 | - return FALSE; | |
49 | - } | |
50 | - else if(p == SNFUN(self).mOptions + XYZSH_OPTION_MAX) { | |
51 | - p = SNFUN(self).mOptions; | |
52 | - } | |
53 | - } | |
54 | - else { | |
55 | - p->mKey = MANAGED key; | |
56 | - return TRUE; | |
57 | - } | |
58 | - } | |
59 | -} | |
60 | - | |
61 | -BOOL nfun_option_with_argument_item(sObject* self, char* key) | |
62 | -{ | |
63 | - int hash_value = options_hash_fun(key); | |
64 | - option_hash_it* p = SNFUN(self).mOptions + hash_value; | |
65 | - | |
66 | - while(1) { | |
67 | - if(p->mKey) { | |
68 | - if(strcmp(p->mKey, key) == 0) { | |
69 | - return TRUE; | |
70 | - } | |
71 | - else { | |
72 | - p++; | |
73 | - if(p == SNFUN(self).mOptions + hash_value) { | |
74 | - return FALSE; | |
75 | - } | |
76 | - else if(p == SNFUN(self).mOptions + XYZSH_OPTION_MAX) { | |
77 | - p = SNFUN(self).mOptions; | |
78 | - } | |
79 | - } | |
80 | - } | |
81 | - else { | |
82 | - return FALSE; | |
83 | - } | |
84 | - } | |
85 | -} | |
86 | - | |
87 | -int nfun_gc_children_mark(sObject* self) | |
88 | -{ | |
89 | - int count = 0; | |
90 | - | |
91 | - sObject* parent = SNFUN(self).mParent; | |
92 | - if(parent) { | |
93 | - if((parent->mFlg & GC_MARK) == 0) { | |
94 | - parent->mFlg |= GC_MARK; | |
95 | - count++; | |
96 | - count += object_gc_children_mark(parent); | |
97 | - } | |
98 | - } | |
99 | - | |
100 | - return count; | |
101 | -} | |
102 | - | |
103 | 6 | sObject* access_object(char* name, sObject** current, sObject* running_object) |
104 | 7 | { |
105 | 8 | sObject* object; |
@@ -137,29 +40,3 @@ sObject* access_object3(char* name, sObject** current) | ||
137 | 40 | *current = SUOBJECT((*current)).mParent; |
138 | 41 | } |
139 | 42 | } |
140 | - | |
141 | -sObject* external_prog_new_from_gc(char* path, BOOL user_object) | |
142 | -{ | |
143 | - sObject* self = gc_get_free_object(T_EXTPROG, user_object); | |
144 | - | |
145 | - SEXTPROG(self).mPath = STRDUP(path); | |
146 | - | |
147 | - return self; | |
148 | -} | |
149 | - | |
150 | -void external_prog_delete_gc(sObject* self) | |
151 | -{ | |
152 | - FREE(SEXTPROG(self).mPath); | |
153 | -} | |
154 | - | |
155 | -sObject* extobj_new_from_gc(void* object, fExtObjMarkFun mark_fun, fExtObjFreeFun free_fun, BOOL user_object) | |
156 | -{ | |
157 | - sObject* self = gc_get_free_object(T_EXTOBJ, user_object); | |
158 | - | |
159 | - SEXTOBJ(self).mObject = object; | |
160 | - SEXTOBJ(self).mMarkFun = mark_fun; | |
161 | - SEXTOBJ(self).mFreeFun = free_fun; | |
162 | - | |
163 | - return self; | |
164 | -} | |
165 | - |
@@ -256,7 +256,6 @@ static BOOL read_env(char** p, sBuf* buf, char* sname, int* sline, BOOL expand_q | ||
256 | 256 | |
257 | 257 | static BOOL add_argument_to_command(sBuf* buf, sCommand* command, char* sname, int* sline); |
258 | 258 | |
259 | -/// 一単語読み込み | |
260 | 259 | static BOOL read_one_argument(char** p, sBuf* buf, char* sname, int* sline, BOOL expand_quote, sCommand* command, sObject* block, sObject** current_object) |
261 | 260 | { |
262 | 261 | BOOL squote = FALSE; |
@@ -381,7 +380,7 @@ static BOOL read_one_argument(char** p, sBuf* buf, char* sname, int* sline, BOOL | ||
381 | 380 | return FALSE; |
382 | 381 | } |
383 | 382 | } |
384 | - else if(gxyzshSigInt) { | |
383 | + else if(gXyzshSigInt) { | |
385 | 384 | err_msg("signal interrupt", sname, *sline, "here document"); |
386 | 385 | return FALSE; |
387 | 386 | } |
@@ -655,7 +654,6 @@ void tilda_expasion(char* file, ALLOC char** file2) | ||
655 | 654 | *file2 = STRDUP(result); |
656 | 655 | } |
657 | 656 | |
658 | - | |
659 | 657 | static BOOL read_statment(char**p, sStatment* statment, sObject* block, char* sname, int* sline, sObject** current_object); |
660 | 658 | |
661 | 659 | // result --> TRUE: success |
@@ -1012,7 +1010,7 @@ static BOOL read_statment(char**p, sStatment* statment, sObject* block, char* sn | ||
1012 | 1010 | } |
1013 | 1011 | |
1014 | 1012 | // result --> TRUE: success |
1015 | -// result --> FALSE: There is a error message on gErrMsg. Please output the error message and stop running | |
1013 | +// result --> FALSE: There is an error message on gErrMsg. Please output the error message and stop running | |
1016 | 1014 | BOOL parse(char* p, char* sname, int* sline, sObject* block, sObject** current_object) |
1017 | 1015 | { |
1018 | 1016 | SBLOCK(block).mSource = STRDUP(p); |
@@ -570,7 +570,7 @@ char** readline_on_complete(const char* text, int start, int end) | ||
570 | 570 | sObject* nextout = FD_NEW_STACK(kFDKindBuf, 0); |
571 | 571 | |
572 | 572 | sObject* fun = FUN_NEW_STACK(NULL); |
573 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
573 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
574 | 574 | vector_add(gStackFrames, stackframe); |
575 | 575 | //uobject_init(stackframe); |
576 | 576 | SFUN(fun).mLocalObjects = stackframe; |
@@ -722,7 +722,7 @@ BOOL cmd_completion(sObject* nextin, sObject* nextout, sRunInfo* runinfo) | ||
722 | 722 | stack_start_stack(); |
723 | 723 | |
724 | 724 | sObject* fun = FUN_NEW_STACK(NULL); |
725 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
725 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
726 | 726 | vector_add(gStackFrames, stackframe); |
727 | 727 | //uobject_init(stackframe); |
728 | 728 | SFUN(fun).mLocalObjects = stackframe; |
@@ -877,7 +877,7 @@ static int readline_macro(int count, int key) | ||
877 | 877 | xyzsh_set_signal(); |
878 | 878 | |
879 | 879 | sObject* fun = FUN_NEW_STACK(NULL); |
880 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
880 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
881 | 881 | vector_add(gStackFrames, stackframe); |
882 | 882 | //uobject_init(stackframe); |
883 | 883 | SFUN(fun).mLocalObjects = stackframe; |
@@ -25,7 +25,9 @@ sObject* gStderr; | ||
25 | 25 | |
26 | 26 | sObject* gGlobalPipe; |
27 | 27 | |
28 | -sObject* gObjectsInPipe; | |
28 | +static sObject* gObjectsInPipe; | |
29 | + | |
30 | +static sObject* gRunningObjects; | |
29 | 31 | |
30 | 32 | BOOL add_object_to_objects_in_pipe(sObject* object, sRunInfo* runinfo, sCommand* command) |
31 | 33 | { |
@@ -53,7 +55,7 @@ void run_init(enum eAppType app_type) | ||
53 | 55 | gStdout = FD_NEW_STACK(kFDKindBuf, 0); |
54 | 56 | gStderr = FD_NEW_STACK(kFDKindBuf, 0); |
55 | 57 | gJobs = VECTOR_NEW_GC(16, FALSE); |
56 | - uobject_put(gxyzshObject, "_jobs", gJobs); | |
58 | + uobject_put(gXyzshObject, "_jobs", gJobs); | |
57 | 59 | |
58 | 60 | xyzsh_job_done = NULL; |
59 | 61 |
@@ -63,345 +65,14 @@ void run_init(enum eAppType app_type) | ||
63 | 65 | gGlobalPipe = FD_NEW_STACK(kFDKindBuf, 0); |
64 | 66 | |
65 | 67 | gObjectsInPipe = VECTOR_NEW_GC(10, FALSE); |
66 | - uobject_put(gxyzshObject, "_objects_in_pipe", gObjectsInPipe); | |
67 | -} | |
68 | - | |
69 | -void run_final() | |
70 | -{ | |
71 | -} | |
72 | - | |
73 | -sObject* fd_new_from_stack(int kind, int fd) | |
74 | -{ | |
75 | - sObject* self = stack_get_free_object(T_FD); | |
76 | - | |
77 | - SFD(self).mKind = kind; | |
78 | - | |
79 | - if(kind == kFDKindFD) { | |
80 | - SFD(self).fd.mFD = fd; | |
81 | - } | |
82 | - else { | |
83 | - SFD(self).fdbuf.mBuf = MALLOC(1024); | |
84 | - SFD(self).fdbuf.mBuf[0] = 0; | |
85 | - | |
86 | - SFD(self).fdbuf.mBufSize = 1024; | |
87 | - SFD(self).fdbuf.mBufLen = 0; | |
88 | - | |
89 | - SFD(self).fdbuf.mLines = VECTOR_NEW_MALLOC(32); | |
90 | - SFD(self).fdbuf.mReadedLineNumber = 0; | |
91 | - } | |
92 | - | |
93 | - return self; | |
94 | -} | |
95 | - | |
96 | -void fd_delete_stack(sObject* self) | |
97 | -{ | |
98 | - if(SFD(self).mKind == kFDKindBuf) { | |
99 | - sObject* v = SFD(self).fdbuf.mLines; | |
100 | - int i; | |
101 | - for(i=0; i<vector_count(v); i++) { | |
102 | - FREE(vector_item(v, i)); | |
103 | - } | |
104 | - vector_delete_malloc(SFD(self).fdbuf.mLines); | |
105 | - | |
106 | - FREE(SFD(self).fdbuf.mBuf); | |
107 | - } | |
108 | -} | |
109 | - | |
110 | -// TRUE: Success | |
111 | -// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
112 | -BOOL bufsiz_write(int fd, char* buf, int buf_size) | |
113 | -{ | |
114 | - char* p = buf; | |
115 | - while(p - buf < buf_size) { | |
116 | - int size; | |
117 | - if(buf_size - (p - buf) < BUFSIZ) { | |
118 | - size = buf_size - (p-buf); | |
119 | - } | |
120 | - else { | |
121 | - size = BUFSIZ; | |
122 | - } | |
123 | - | |
124 | - if(write(fd, p, size) < 0) { | |
125 | - if(errno == EINTR) { | |
126 | - while(!gxyzshSigInt); | |
127 | - gxyzshSigInt = FALSE; | |
128 | - return FALSE; | |
129 | - } | |
130 | - return FALSE; | |
131 | - } | |
132 | - | |
133 | - if(gxyzshSigInt) { | |
134 | - gxyzshSigInt = FALSE; | |
135 | - return FALSE; | |
136 | - } | |
137 | - | |
138 | - p+=size; | |
139 | - } | |
140 | - | |
141 | - return TRUE; | |
142 | -} | |
143 | - | |
144 | -BOOL fd_guess_lf(sObject* self, enum eLineField* lf) | |
145 | -{ | |
146 | - *lf = -1; | |
147 | - char* p = SFD(self).fdbuf.mBuf; | |
148 | - | |
149 | - while(*p) { | |
150 | - if(*p == '\a') { | |
151 | - *lf = kBel; | |
152 | - return TRUE; | |
153 | - } | |
154 | - else { | |
155 | - p++; | |
156 | - } | |
157 | - } | |
158 | - | |
159 | - if(*lf == -1) { | |
160 | - p = SFD(self).fdbuf.mBuf; | |
161 | - | |
162 | - while(*p) { | |
163 | - if(*p == '\r' && *(p+1) == '\n') { | |
164 | - *lf = kCRLF; | |
165 | - return TRUE; | |
166 | - } | |
167 | - else { | |
168 | - p++; | |
169 | - } | |
170 | - } | |
171 | - } | |
172 | - | |
173 | - if(*lf == -1) { | |
174 | - p = SFD(self).fdbuf.mBuf; | |
175 | - | |
176 | - while(*p) { | |
177 | - if(*p == '\r') { | |
178 | - *lf = kCR; | |
179 | - return TRUE; | |
180 | - } | |
181 | - else { | |
182 | - p++; | |
183 | - } | |
184 | - } | |
185 | - } | |
186 | - | |
187 | - if(*lf == -1) { | |
188 | - p = SFD(self).fdbuf.mBuf; | |
189 | - | |
190 | - while(*p) { | |
191 | - if(*p == '\n') { | |
192 | - *lf = kLF; | |
193 | - return TRUE; | |
194 | - } | |
195 | - else { | |
196 | - p++; | |
197 | - } | |
198 | - } | |
199 | - } | |
200 | - | |
201 | - return FALSE; | |
202 | -} | |
203 | - | |
204 | -void fd_split(sObject* self, enum eLineField lf) | |
205 | -{ | |
206 | - assert(TYPE(self) == T_FD && SFD(self).mKind == kFDKindBuf); | |
207 | - | |
208 | - sObject* v = SFD(self).fdbuf.mLines; | |
209 | - | |
210 | - if(SFD(self).fdbuf.mLinesLineField != lf) { | |
211 | - int i; | |
212 | - for(i=0; i<vector_count(v); i++) { | |
213 | - FREE(vector_item(v, i)); | |
214 | - } | |
215 | - vector_clear(v); | |
216 | - SFD(self).fdbuf.mReadedLineNumber = 0; | |
217 | - } | |
218 | - | |
219 | - if(vector_count(v) == 0) { | |
220 | - char* p = SFD(self).fdbuf.mBuf; | |
221 | - char* new_line = p; | |
222 | - if(lf == kCRLF) { | |
223 | - while(1) { | |
224 | - if(*p == '\r' && *(p+1) == '\n') { | |
225 | - p+=2; | |
226 | - const int size = p - new_line; | |
227 | - char* line = MALLOC(size + 1); | |
228 | - memcpy(line, new_line, size); | |
229 | - line[size] = 0; | |
230 | - vector_add(v, line); | |
231 | - new_line = p; | |
232 | - } | |
233 | - else if(p - SFD(self).fdbuf.mBuf >= SFD(self).fdbuf.mBufLen) { | |
234 | - const int size = p - new_line; | |
235 | - if(size > 0) { | |
236 | - char* line = MALLOC(size + 1 + 2); | |
237 | - memcpy(line, new_line, size); | |
238 | - line[size] = '\r'; | |
239 | - line[size+1] = '\n'; | |
240 | - line[size+2] = 0; | |
241 | - vector_add(v, line); | |
242 | - } | |
243 | - break; | |
244 | - } | |
245 | - else { | |
246 | - p++; | |
247 | - } | |
248 | - } | |
249 | - } | |
250 | - else { | |
251 | - char split_char; | |
252 | - if(lf == kLF) { | |
253 | - split_char = '\n'; | |
254 | - } | |
255 | - else if(lf == kCR) { | |
256 | - split_char = '\r'; | |
257 | - } | |
258 | - else { | |
259 | - split_char = '\a'; | |
260 | - } | |
261 | - | |
262 | - while(1) { | |
263 | - if(*p == split_char) { | |
264 | - const int size = p - new_line + 1; | |
265 | - char* line = MALLOC(size + 1); | |
266 | - memcpy(line, new_line, size); | |
267 | - line[size] = 0; | |
268 | - vector_add(v, line); | |
269 | - p++; | |
270 | - new_line = p; | |
271 | - } | |
272 | - else if(p - SFD(self).fdbuf.mBuf >= SFD(self).fdbuf.mBufLen) { | |
273 | - const int size = p - new_line; | |
274 | - if(size > 0) { | |
275 | - char* line = MALLOC(size + 1 + 1); | |
276 | - memcpy(line, new_line, size); | |
277 | - line[size] = split_char; | |
278 | - line[size+1] = 0; | |
279 | - vector_add(v, line); | |
280 | - } | |
281 | - break; | |
282 | - } | |
283 | - else { | |
284 | - p++; | |
285 | - } | |
286 | - } | |
287 | - } | |
288 | - | |
289 | - SFD(self).fdbuf.mLinesLineField = lf; | |
290 | - } | |
291 | -} | |
292 | - | |
293 | -// TRUE: Success | |
294 | -// FALSE: signal interrupt | |
295 | -static BOOL memcpy_buf(char* dest, char* src, size_t size) | |
296 | -{ | |
297 | - char* p = dest; | |
298 | - char* p2 = src; | |
299 | - while(1) { | |
300 | - if(gxyzshSigInt) { | |
301 | - gxyzshSigInt = FALSE; | |
302 | - return FALSE; | |
303 | - } | |
304 | - if(size - (p - dest) < BUFSIZ) { | |
305 | - memcpy(p, p2, size - (p-dest)); | |
306 | - break; | |
307 | - } | |
308 | - else { | |
309 | - memcpy(p, p2, BUFSIZ); | |
310 | - p+=BUFSIZ; | |
311 | - p2+=BUFSIZ; | |
312 | - } | |
313 | - } | |
314 | - | |
315 | - return TRUE; | |
316 | -} | |
317 | - | |
318 | -void fd_clear(sObject* self) | |
319 | -{ | |
320 | - assert(TYPE(self) == T_FD); | |
321 | - | |
322 | - if(SFD(self).mKind == kFDKindBuf) { | |
323 | - SFD(self).fdbuf.mBufLen = 0; | |
324 | - SFD(self).fdbuf.mBuf[0] = 0; | |
325 | - | |
326 | - int i; | |
327 | - for(i=0; i<vector_count(SFD(self).fdbuf.mLines); i++) { | |
328 | - FREE(vector_item(SFD(self).fdbuf.mLines, i)); | |
329 | - } | |
330 | - vector_clear(SFD(self).fdbuf.mLines); | |
331 | - SFD(self).fdbuf.mReadedLineNumber = 0; | |
332 | - } | |
333 | -} | |
334 | - | |
335 | -// TRUE: Success | |
336 | -// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
337 | -BOOL fd_write(sObject* self, char* str, int len) | |
338 | -{ | |
339 | - if(SFD(self).mKind == kFDKindFD) { | |
340 | - if(write(SFD(self).fd.mFD, str, len) < 0) { | |
341 | - return FALSE; | |
342 | - } | |
343 | - } | |
344 | - else { | |
345 | - if((SFD(self).fdbuf.mBufLen+len+1) >= SFD(self).fdbuf.mBufSize) { | |
346 | - int new_size = (SFD(self).fdbuf.mBufSize + len+1) * 1.8; | |
347 | - | |
348 | - SFD(self).fdbuf.mBuf = REALLOC(SFD(self).fdbuf.mBuf, new_size); | |
349 | - SFD(self).fdbuf.mBufSize = new_size; | |
350 | - } | |
351 | - | |
352 | - | |
353 | - if(!memcpy_buf(SFD(self).fdbuf.mBuf + SFD(self).fdbuf.mBufLen, str, len)) { | |
354 | - return FALSE; | |
355 | - } | |
356 | - SFD(self).fdbuf.mBufLen += len; | |
357 | - SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen] = 0; | |
358 | - } | |
359 | - | |
360 | - return TRUE; | |
361 | -} | |
362 | - | |
363 | -// TRUE: Success | |
364 | -// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
365 | -BOOL fd_writec(sObject* self, char c) | |
366 | -{ | |
367 | - if(SFD(self).mKind == kFDKindFD) { | |
368 | - if(write(SFD(self).fd.mFD, &c, 1) < 0) { | |
369 | - return FALSE; | |
370 | - } | |
371 | - } | |
372 | - else { | |
373 | - if((SFD(self).fdbuf.mBufLen) >= SFD(self).fdbuf.mBufSize) { | |
374 | - int new_size = (SFD(self).fdbuf.mBufSize) * 1.8; | |
375 | - SFD(self).fdbuf.mBuf = REALLOC(SFD(self).fdbuf.mBuf, new_size); | |
376 | - SFD(self).fdbuf.mBufSize = new_size; | |
377 | - } | |
378 | - | |
379 | - SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen++] = c; | |
380 | - SFD(self).fdbuf.mBuf[SFD(self).fdbuf.mBufLen] = 0; | |
68 | + uobject_put(gXyzshObject, "_objects_in_pipe", gObjectsInPipe); | |
381 | 69 | |
382 | - if(gxyzshSigInt) { | |
383 | - gxyzshSigInt = FALSE; | |
384 | - return FALSE; | |
385 | - } | |
386 | - } | |
387 | - | |
388 | - return TRUE; | |
70 | + gRunningObjects = VECTOR_NEW_GC(10, FALSE); | |
71 | + uobject_put(gXyzshObject, "_running_block", gRunningObjects); | |
389 | 72 | } |
390 | 73 | |
391 | -// TRUE: Success | |
392 | -// FALSE: signal interrupt. set RCODE_SIGNAL_INTERRUPT on rcode and err message | |
393 | -BOOL fd_flash(sObject* self, int fd) | |
74 | +void run_final() | |
394 | 75 | { |
395 | - if(SFD(self).mKind == kFDKindBuf) { | |
396 | - if(!bufsiz_write(fd, SFD(self).fdbuf.mBuf, SFD(self).fdbuf.mBufLen)) { | |
397 | - return FALSE; | |
398 | - } | |
399 | - | |
400 | - SFD(self).fdbuf.mBufLen = 0; | |
401 | - SFD(self).fdbuf.mBuf[0] = 0; | |
402 | - } | |
403 | - | |
404 | - return TRUE; | |
405 | 76 | } |
406 | 77 | |
407 | 78 | sObject* job_new_from_gc(char* name, pid_t pgroup, struct termios tty) |
@@ -426,9 +97,9 @@ static BOOL nextout_reader(sObject* nextout, int* pipeoutfds, sRunInfo* runinfo, | ||
426 | 97 | { |
427 | 98 | char buf[BUFSIZ+1]; |
428 | 99 | while(1) { |
429 | - if(gxyzshSigInt) { | |
100 | + if(gXyzshSigInt) { | |
430 | 101 | err_msg("signal interrupt1", runinfo->mSName, runinfo->mSLine, program); |
431 | - gxyzshSigInt = FALSE; | |
102 | + gXyzshSigInt = FALSE; | |
432 | 103 | runinfo->mRCode = RCODE_SIGNAL_INTERRUPT; |
433 | 104 | return FALSE; |
434 | 105 | } |
@@ -910,7 +581,7 @@ BOOL run_function(sObject* fun, sObject* nextin, sObject* nextout, sRunInfo* run | ||
910 | 581 | sRunInfo* runinfo2 = SFUN(fun).mRunInfo; |
911 | 582 | SFUN(fun).mRunInfo = runinfo; |
912 | 583 | |
913 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
584 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
914 | 585 | vector_add(gStackFrames, stackframe); |
915 | 586 | //uobject_init(stackframe); |
916 | 587 | SFUN(fun).mLocalObjects = stackframe; |
@@ -1130,6 +801,17 @@ static BOOL run_object(sObject* object, sObject* nextin, sObject* nextout, sRunI | ||
1130 | 801 | } |
1131 | 802 | break; |
1132 | 803 | |
804 | + case T_EXTOBJ: { | |
805 | + if(SEXTOBJ(object).mMainFun) { | |
806 | + if(!SEXTOBJ(object) | |
807 | + .mMainFun(SEXTOBJ(object).mObject, nextin, nextout, runinfo)) | |
808 | + { | |
809 | + return FALSE; | |
810 | + } | |
811 | + } | |
812 | + } | |
813 | + break; | |
814 | + | |
1133 | 815 | default: { |
1134 | 816 | char buf[BUFSIZ]; |
1135 | 817 | sCommand* command = runinfo->mCommand; |
@@ -1393,7 +1075,7 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout | ||
1393 | 1075 | reciever = object; |
1394 | 1076 | object = uobject_item(object, command->mArgs[0]); |
1395 | 1077 | |
1396 | - if(object == gInherit) { | |
1078 | + if(object == gInheritObject) { | |
1397 | 1079 | sObject* running_object = runinfo->mRunningObject; |
1398 | 1080 | |
1399 | 1081 | if(runinfo->mRunningObject) { |
@@ -1459,7 +1141,7 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout | ||
1459 | 1141 | sObject* reciever = current_object; |
1460 | 1142 | sObject* object = access_object(command->mArgs[0], &reciever, runinfo->mRunningObject); |
1461 | 1143 | |
1462 | - if(object == gInherit) { | |
1144 | + if(object == gInheritObject) { | |
1463 | 1145 | sObject* running_object = runinfo->mRunningObject; |
1464 | 1146 | |
1465 | 1147 | if(runinfo->mRunningObject) { |
@@ -1546,6 +1228,9 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout | ||
1546 | 1228 | |
1547 | 1229 | BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* current_object, sObject* running_object) |
1548 | 1230 | { |
1231 | + vector_add(gRunningObjects, running_object); // for marking on gc | |
1232 | + vector_add(gRunningObjects, block); // for marking on gc | |
1233 | + | |
1549 | 1234 | static unsigned int n = 0; |
1550 | 1235 | static int nest_level = 0; |
1551 | 1236 | nest_level++; |
@@ -1559,6 +1244,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1559 | 1244 | } |
1560 | 1245 | nest_level--; |
1561 | 1246 | |
1247 | + (void)vector_pop_back(gRunningObjects); | |
1248 | + (void)vector_pop_back(gRunningObjects); | |
1562 | 1249 | return FALSE; |
1563 | 1250 | } |
1564 | 1251 |
@@ -1594,6 +1281,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1594 | 1281 | |
1595 | 1282 | if(!(n++ % 32)) (void)gc_sweep(); |
1596 | 1283 | |
1284 | + (void)vector_pop_back(gRunningObjects); | |
1285 | + (void)vector_pop_back(gRunningObjects); | |
1597 | 1286 | return FALSE; |
1598 | 1287 | } |
1599 | 1288 |
@@ -1612,6 +1301,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1612 | 1301 | vector_clear(gObjectsInPipe); |
1613 | 1302 | } |
1614 | 1303 | if(!(n++ % 32)) (void)gc_sweep(); |
1304 | + (void)vector_pop_back(gRunningObjects); | |
1305 | + (void)vector_pop_back(gRunningObjects); | |
1615 | 1306 | return FALSE; |
1616 | 1307 | } |
1617 | 1308 | } |
@@ -1630,13 +1321,15 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1630 | 1321 | vector_clear(gObjectsInPipe); |
1631 | 1322 | } |
1632 | 1323 | if(!(n++ % 32)) (void)gc_sweep(); |
1324 | + (void)vector_pop_back(gRunningObjects); | |
1325 | + (void)vector_pop_back(gRunningObjects); | |
1633 | 1326 | return FALSE; |
1634 | 1327 | } |
1635 | 1328 | } |
1636 | 1329 | |
1637 | 1330 | /// the end of statment /// |
1638 | - if(gxyzshSigUser) { | |
1639 | - gxyzshSigUser = FALSE; | |
1331 | + if(gXyzshSigUser) { | |
1332 | + gXyzshSigUser = FALSE; | |
1640 | 1333 | sCommand* command = runinfo.mCommand; |
1641 | 1334 | err_msg("command not found", runinfo.mSName, runinfo.mSLine, ""); //command->mArgs[0]); |
1642 | 1335 | stack_end_stack(); |
@@ -1647,10 +1340,12 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1647 | 1340 | vector_clear(gObjectsInPipe); |
1648 | 1341 | } |
1649 | 1342 | if(!(n++ % 32)) (void)gc_sweep(); |
1343 | + (void)vector_pop_back(gRunningObjects); | |
1344 | + (void)vector_pop_back(gRunningObjects); | |
1650 | 1345 | return FALSE; |
1651 | 1346 | } |
1652 | - else if(runinfo.mRCode == 128+SIGINT || gxyzshSigInt) { | |
1653 | - gxyzshSigInt = FALSE; | |
1347 | + else if(runinfo.mRCode == 128+SIGINT || gXyzshSigInt) { | |
1348 | + gXyzshSigInt = FALSE; | |
1654 | 1349 | sCommand* command = runinfo.mCommand; |
1655 | 1350 | err_msg("signal interrupt15", runinfo.mSName, runinfo.mSLine, command->mArgs[0]); |
1656 | 1351 | *rcode = RCODE_SIGNAL_INTERRUPT; |
@@ -1662,6 +1357,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1662 | 1357 | vector_clear(gObjectsInPipe); |
1663 | 1358 | } |
1664 | 1359 | if(!(n++ % 32)) (void)gc_sweep(); |
1360 | + (void)vector_pop_back(gRunningObjects); | |
1361 | + (void)vector_pop_back(gRunningObjects); | |
1665 | 1362 | return FALSE; |
1666 | 1363 | } |
1667 | 1364 | else if((statment->mFlags & STATMENT_OROR) && runinfo.mRCode == 0) { |
@@ -1692,6 +1389,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* | ||
1692 | 1389 | } |
1693 | 1390 | if(!(n++ % 32)) (void)gc_sweep(); |
1694 | 1391 | |
1392 | + (void)vector_pop_back(gRunningObjects); | |
1393 | + (void)vector_pop_back(gRunningObjects); | |
1695 | 1394 | return TRUE; |
1696 | 1395 | } |
1697 | 1396 |
@@ -1880,7 +1579,7 @@ BOOL load_file(char* fname, sObject* nextin, sObject* nextout, sRunInfo* runinfo | ||
1880 | 1579 | FREE(buf); |
1881 | 1580 | |
1882 | 1581 | sObject* fun = FUN_NEW_STACK(NULL); |
1883 | - sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE); | |
1582 | + sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); | |
1884 | 1583 | vector_add(gStackFrames, stackframe); |
1885 | 1584 | //uobject_init(stackframe); |
1886 | 1585 | SFUN(fun).mLocalObjects = stackframe; |
@@ -5,9 +5,9 @@ | ||
5 | 5 | #include "config.h" |
6 | 6 | #include "xyzsh/xyzsh.h" |
7 | 7 | |
8 | -////////////////////////////////////////////////////////////////////// | |
8 | +//////////////////////////////////////////////////// | |
9 | 9 | // Initialization |
10 | -////////////////////////////////////////////////////////////////////// | |
10 | +//////////////////////////////////////////////////// | |
11 | 11 | #ifndef MDEBUG |
12 | 12 | sObject* string_new_from_malloc(char* str) |
13 | 13 | { |
@@ -93,9 +93,9 @@ sObject* string_new_from_stack(char* str) | ||
93 | 93 | return self; |
94 | 94 | } |
95 | 95 | |
96 | -////////////////////////////////////////////////////////////////////// | |
96 | +///////////////////////////////////////////////////// | |
97 | 97 | // Finalization |
98 | -////////////////////////////////////////////////////////////////////// | |
98 | +///////////////////////////////////////////////////// | |
99 | 99 | void string_delete_malloc(sObject* self) |
100 | 100 | { |
101 | 101 | FREE(SSTRING(self).mStr); |
@@ -113,9 +113,9 @@ void string_delete_stack(sObject* self) | ||
113 | 113 | FREE(SSTRING(self).mStr); |
114 | 114 | } |
115 | 115 | |
116 | -////////////////////////////////////////////////////////////////////// | |
116 | +///////////////////////////////////////////////////// | |
117 | 117 | // Some functions |
118 | -////////////////////////////////////////////////////////////////////// | |
118 | +///////////////////////////////////////////////////// | |
119 | 119 | void string_insert(sObject* self, int pos, char* str) |
120 | 120 | { |
121 | 121 | char* new_str; |
@@ -2,7 +2,6 @@ | ||
2 | 2 | #include "xyzsh/xyzsh.h" |
3 | 3 | #include <string.h> |
4 | 4 | #include <stdio.h> |
5 | -#include <assert.h> | |
6 | 5 | |
7 | 6 | static unsigned int get_uobject_value(sObject* self, char* key) |
8 | 7 | { |
@@ -97,11 +96,11 @@ sObject* uobject_new_from_stack(int size, sObject* parent, char* name) | ||
97 | 96 | return self; |
98 | 97 | } |
99 | 98 | |
100 | -sObject* gInherit; | |
99 | +sObject* gInheritObject; | |
101 | 100 | |
102 | 101 | void uobject_root_init(sObject* self) |
103 | 102 | { |
104 | - assert(TYPE(self) == T_UOBJECT); | |
103 | + ASSERT(TYPE(self) == T_UOBJECT); | |
105 | 104 | |
106 | 105 | uobject_put(self, "unset", NFUN_NEW_GC(cmd_unset, NULL, TRUE)); |
107 | 106 | sObject* readline = UOBJECT_NEW_GC(8, self, "rl", TRUE); |
@@ -136,8 +135,8 @@ void uobject_root_init(sObject* self) | ||
136 | 135 | uobject_put(self, "write", NFUN_NEW_GC(cmd_write, NULL, TRUE)); |
137 | 136 | uobject_put(self, "quote", NFUN_NEW_GC(cmd_quote, NULL, TRUE)); |
138 | 137 | uobject_put(self, "load", NFUN_NEW_GC(cmd_load, NULL, TRUE)); |
139 | - gInherit = NFUN_NEW_GC(cmd_inherit, NULL, TRUE); | |
140 | - uobject_put(self, "inherit", gInherit); | |
138 | + gInheritObject = NFUN_NEW_GC(cmd_inherit, NULL, TRUE); | |
139 | + uobject_put(self, "inherit", gInheritObject); | |
141 | 140 | uobject_put(self, "eval", NFUN_NEW_GC(cmd_eval, NULL, TRUE)); |
142 | 141 | uobject_put(self, "object", NFUN_NEW_GC(cmd_object, NULL, TRUE)); |
143 | 142 | uobject_put(self, "pwo", NFUN_NEW_GC(cmd_pwo, NULL, TRUE)); |
@@ -276,7 +275,7 @@ void uobject_root_init(sObject* self) | ||
276 | 275 | |
277 | 276 | void uobject_init(sObject* self) |
278 | 277 | { |
279 | - assert(TYPE(self) == T_UOBJECT); | |
278 | + ASSERT(TYPE(self) == T_UOBJECT); | |
280 | 279 | |
281 | 280 | uobject_put(self, "run", NFUN_NEW_GC(cmd_mrun, NULL, FALSE)); |
282 | 281 | uobject_put(self, "self", self); |
@@ -287,7 +286,7 @@ void uobject_init(sObject* self) | ||
287 | 286 | |
288 | 287 | void uobject_delete_gc(sObject* self) |
289 | 288 | { |
290 | - assert(TYPE(self) == T_UOBJECT); | |
289 | + ASSERT(TYPE(self) == T_UOBJECT); | |
291 | 290 | |
292 | 291 | uobject_it* it = SUOBJECT(self).mEntryIt; |
293 | 292 |
@@ -303,7 +302,7 @@ void uobject_delete_gc(sObject* self) | ||
303 | 302 | |
304 | 303 | void uobject_delete_stack(sObject* self) |
305 | 304 | { |
306 | - assert(TYPE(self) == T_UOBJECT); | |
305 | + ASSERT(TYPE(self) == T_UOBJECT); | |
307 | 306 | |
308 | 307 | uobject_it* it = SUOBJECT(self).mEntryIt; |
309 | 308 |
@@ -319,7 +318,7 @@ void uobject_delete_stack(sObject* self) | ||
319 | 318 | |
320 | 319 | int uobject_gc_children_mark(sObject* self) |
321 | 320 | { |
322 | - assert(TYPE(self) == T_UOBJECT); | |
321 | + ASSERT(TYPE(self) == T_UOBJECT); | |
323 | 322 | |
324 | 323 | int count = 0; |
325 | 324 |
@@ -342,7 +341,7 @@ int uobject_gc_children_mark(sObject* self) | ||
342 | 341 | |
343 | 342 | void uobject_put(sObject* self, char* key, void* item) |
344 | 343 | { |
345 | - assert(TYPE(self) == T_UOBJECT); | |
344 | + ASSERT(TYPE(self) == T_UOBJECT); | |
346 | 345 | |
347 | 346 | if(SUOBJECT(self).mCounter >= SUOBJECT(self).mTableSize) { |
348 | 347 | resize(self); |
@@ -369,7 +368,7 @@ void uobject_put(sObject* self, char* key, void* item) | ||
369 | 368 | |
370 | 369 | void* uobject_item(sObject* self, char* key) |
371 | 370 | { |
372 | - assert(TYPE(self) == T_UOBJECT); | |
371 | + ASSERT(TYPE(self) == T_UOBJECT); | |
373 | 372 | |
374 | 373 | uobject_it* it = SUOBJECT(self).mTable[ get_uobject_value(self, key) ]; |
375 | 374 |
@@ -383,7 +382,7 @@ void* uobject_item(sObject* self, char* key) | ||
383 | 382 | |
384 | 383 | void uobject_clear(sObject* self) |
385 | 384 | { |
386 | - assert(TYPE(self) == T_UOBJECT); | |
385 | + ASSERT(TYPE(self) == T_UOBJECT); | |
387 | 386 | |
388 | 387 | int i; |
389 | 388 | int max; |
@@ -403,7 +402,7 @@ void uobject_clear(sObject* self) | ||
403 | 402 | |
404 | 403 | uobject_it* uobject_loop_begin(sObject* self) |
405 | 404 | { |
406 | - assert(TYPE(self) == T_UOBJECT); | |
405 | + ASSERT(TYPE(self) == T_UOBJECT); | |
407 | 406 | |
408 | 407 | return SUOBJECT(self).mEntryIt; |
409 | 408 | } |
@@ -425,14 +424,15 @@ uobject_it* uobject_loop_next(uobject_it* it) | ||
425 | 424 | |
426 | 425 | int uobject_count(sObject* self) |
427 | 426 | { |
428 | - assert(TYPE(self) == T_UOBJECT); | |
427 | + ASSERT(TYPE(self) == T_UOBJECT); | |
429 | 428 | |
430 | 429 | return SUOBJECT(self).mCounter; |
431 | 430 | } |
432 | 431 | |
433 | 432 | static void erase_from_list(sObject* self, uobject_it* rit) |
434 | 433 | { |
435 | - assert(TYPE(self) == T_UOBJECT); | |
434 | + ASSERT(TYPE(self) == T_UOBJECT); | |
435 | + | |
436 | 436 | if(rit == SUOBJECT(self).mEntryIt) { |
437 | 437 | SUOBJECT(self).mEntryIt = rit->mNextIt; |
438 | 438 | } |
@@ -452,7 +452,7 @@ static void erase_from_list(sObject* self, uobject_it* rit) | ||
452 | 452 | |
453 | 453 | BOOL uobject_erase(sObject* self, char* key) |
454 | 454 | { |
455 | - assert(TYPE(self) == T_UOBJECT); | |
455 | + ASSERT(TYPE(self) == T_UOBJECT); | |
456 | 456 | const unsigned int hash_value = get_uobject_value(self, key); |
457 | 457 | uobject_it* it = SUOBJECT(self).mTable[hash_value]; |
458 | 458 |
@@ -9,10 +9,10 @@ | ||
9 | 9 | |
10 | 10 | sObject* gErrMsg; |
11 | 11 | |
12 | -volatile BOOL gxyzshSigInt; | |
13 | -volatile BOOL gxyzshSigUser; | |
14 | -volatile BOOL gxyzshSigTstp; | |
15 | -volatile BOOL gxyzshSigCont; | |
12 | +volatile BOOL gXyzshSigInt; | |
13 | +volatile BOOL gXyzshSigUser; | |
14 | +volatile BOOL gXyzshSigTstp; | |
15 | +volatile BOOL gXyzshSigCont; | |
16 | 16 | |
17 | 17 | sObject* gDirStack; |
18 | 18 |
@@ -57,33 +57,6 @@ void xyzsh_read_rc_core(char* path) | ||
57 | 57 | xyzsh_restore_signal_default(); |
58 | 58 | } |
59 | 59 | |
60 | -/* | |
61 | -typedef struct { | |
62 | - char* mData; | |
63 | - int mData2; | |
64 | -} sTestObj; | |
65 | - | |
66 | -int sTestObj_markfun(sObject* self) | |
67 | -{ | |
68 | - return 0; | |
69 | -} | |
70 | - | |
71 | -void sTestObj_freefun(void* self) | |
72 | -{ | |
73 | - sTestObj* obj = self; | |
74 | - FREE(obj->mData); | |
75 | - FREE(obj); | |
76 | -} | |
77 | - | |
78 | -sObject* sTestObj_new(char* data, int data2) | |
79 | -{ | |
80 | - sTestObj* obj = MALLOC(sizeof(sTestObj)); | |
81 | - obj->mData = STRDUP(data); | |
82 | - obj->mData2 = data2; | |
83 | - return EXTOBJ_NEW_GC(obj, sTestObj_markfun, sTestObj_freefun, TRUE); | |
84 | -} | |
85 | -*/ | |
86 | - | |
87 | 60 | static void xyzsh_read_rc() |
88 | 61 | { |
89 | 62 | char sys_rc_path[PATH_MAX]; |
@@ -108,14 +81,11 @@ static void xyzsh_read_rc() | ||
108 | 81 | xyzsh_read_rc_core(help_rc_path); |
109 | 82 | xyzsh_read_rc_core(completion_rc_path); |
110 | 83 | xyzsh_read_rc_core(user_rc_path); |
111 | - | |
112 | - | |
113 | -// uobject_put(gRootObject, "test", sTestObj_new("AAA", 1)); | |
114 | 84 | } |
115 | 85 | |
116 | 86 | void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script) |
117 | 87 | { |
118 | - setenv("XYZSH_VERSION", "1.2.7", 1); | |
88 | + setenv("XYZSH_VERSION", "1.2.8", 1); | |
119 | 89 | setenv("XYZSH_DATAROOTDIR", DATAROOTDIR, 1); |
120 | 90 | |
121 | 91 | setlocale(LC_ALL, ""); |
@@ -125,10 +95,10 @@ void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script) | ||
125 | 95 | |
126 | 96 | gErrMsg = STRING_NEW_STACK(""); |
127 | 97 | |
128 | - gxyzshSigInt = FALSE; | |
129 | - gxyzshSigUser = FALSE; | |
130 | - gxyzshSigTstp = FALSE; | |
131 | - gxyzshSigCont = FALSE; | |
98 | + gXyzshSigInt = FALSE; | |
99 | + gXyzshSigUser = FALSE; | |
100 | + gXyzshSigTstp = FALSE; | |
101 | + gXyzshSigCont = FALSE; | |
132 | 102 | |
133 | 103 | xyzsh_set_signal_other = NULL; |
134 | 104 |
@@ -137,7 +107,7 @@ void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script) | ||
137 | 107 | xyzsh_readline_init(FALSE); |
138 | 108 | |
139 | 109 | gDirStack = VECTOR_NEW_GC(10, FALSE); |
140 | - uobject_put(gxyzshObject, "_dir_stack", gDirStack); | |
110 | + uobject_put(gXyzshObject, "_dir_stack", gDirStack); | |
141 | 111 | |
142 | 112 | char* term_env = getenv("TERM"); |
143 | 113 | if(term_env != NULL && strcmp(term_env, "") != 0) { |
@@ -199,7 +169,7 @@ void err_msg_adding(char* msg, char* sname, int line, char* command) | ||
199 | 169 | |
200 | 170 | void sig_int() |
201 | 171 | { |
202 | - gxyzshSigInt = TRUE; | |
172 | + gXyzshSigInt = TRUE; | |
203 | 173 | |
204 | 174 | #ifdef MDEBUG |
205 | 175 | fprintf(stderr, "SIGINT!!\n"); |
@@ -208,7 +178,7 @@ fprintf(stderr, "SIGINT!!\n"); | ||
208 | 178 | |
209 | 179 | void sig_tstp() |
210 | 180 | { |
211 | - gxyzshSigInt = TRUE; | |
181 | + gXyzshSigInt = TRUE; | |
212 | 182 | #ifdef MDEBUG |
213 | 183 | fprintf(stderr, "SIGTSTP!!\n"); |
214 | 184 | #endif |
@@ -217,7 +187,7 @@ fprintf(stderr, "SIGTSTP!!\n"); | ||
217 | 187 | void sig_int_optc() |
218 | 188 | { |
219 | 189 | sigchld_block(1); |
220 | - gxyzshSigInt = TRUE; | |
190 | + gXyzshSigInt = TRUE; | |
221 | 191 | //killpg(0, SIGINT); |
222 | 192 | #ifdef MDEBUG |
223 | 193 | //fprintf(stderr, "SIGINT!!\n"); |
@@ -245,7 +215,7 @@ void sig_cont_optc() | ||
245 | 215 | |
246 | 216 | void sig_user() |
247 | 217 | { |
248 | - gxyzshSigUser = TRUE; | |
218 | + gXyzshSigUser = TRUE; | |
249 | 219 | } |
250 | 220 | |
251 | 221 | void sigchld_action(int signum, siginfo_t* info, void* ctx) |
@@ -1,14 +1,6 @@ | ||
1 | 1 | #ifndef XYZSH_BLOCK_H |
2 | 2 | #define XYZSH_BLOCK_H |
3 | 3 | |
4 | -#ifdef MDEBUG | |
5 | -sObject* block_new_debug_from_malloc(const char* fname, int line, const char* func_name); | |
6 | -#define BLOCK_NEW_MALLOC() block_new_debug_from_malloc(__FILE__, __LINE__, __FUNCTION__) | |
7 | -#else | |
8 | -sObject* block_new_from_malloc(); | |
9 | -#define BLOCK_NEW_MALLOC() block_new_from_malloc() | |
10 | -#endif | |
11 | - | |
12 | 4 | sObject* block_new_from_gc(BOOL user_object); |
13 | 5 | #define BLOCK_NEW_GC(o) block_new_from_gc(o) |
14 | 6 |
@@ -17,19 +9,15 @@ sObject* block_new_from_stack(); | ||
17 | 9 | |
18 | 10 | sObject* block_clone_gc(sObject* source, int type, BOOL user_object); |
19 | 11 | sObject* block_clone_stack(sObject* source, int type); |
20 | -sObject* block_clone_malloc(sObject* source); | |
21 | 12 | int block_gc_children_mark(sObject* self); |
22 | 13 | |
23 | 14 | void block_delete_stack(sObject* self); |
24 | 15 | void block_delete_gc(sObject* self); |
25 | -void block_delete_malloc(sObject* self); | |
26 | 16 | |
27 | 17 | sCommand* sCommand_new(sStatment* statment); |
28 | 18 | void sStatment_delete(sStatment* self); |
29 | -void sStatment_delete_malloc(sStatment* self); | |
30 | 19 | sStatment* sStatment_new(sObject* block, int sline, char* sname); |
31 | 20 | void sCommand_delete(sCommand* self); |
32 | -void sCommand_delete_malloc(sCommand* self); | |
33 | 21 | |
34 | 22 | void sCommand_add_arg_to_command(sCommand* self, MANAGED char* buf, int env, int glob); |
35 | 23 | BOOL sCommand_add_message(sCommand* self, MANAGED char* message); |
@@ -6,6 +6,7 @@ | ||
6 | 6 | #define XYZSH_DEBUG_H |
7 | 7 | |
8 | 8 | #include <stdlib.h> |
9 | +#include <assert.h> | |
9 | 10 | |
10 | 11 | #define P(F, O) { FILE* fp = fopen(F, "a"); fprintf(fp, O); fprintf(fp, "\n"); fclose(fp); } |
11 | 12 |
@@ -19,6 +20,7 @@ | ||
19 | 20 | # define FREE(o) free(o) |
20 | 21 | # define TIMER_BEGIN(msg) |
21 | 22 | # define TIMER_END() |
23 | +# define ASSERT(o) | |
22 | 24 | |
23 | 25 | #else |
24 | 26 |
@@ -42,6 +44,7 @@ void timer_count_end(const char* file, int line, const char* fun); | ||
42 | 44 | |
43 | 45 | # define TIMER_BEGIN(msg) timer_count_start(msg) |
44 | 46 | # define TIMER_END() timer_count_end(__FILE__, __LINE__, __FUNCTION__) |
47 | +# define ASSERT(o) assert(o) | |
45 | 48 | |
46 | 49 | #endif |
47 | 50 |
@@ -63,8 +63,25 @@ enum eCommandKind { | ||
63 | 63 | kCommandMax |
64 | 64 | }; |
65 | 65 | |
66 | -typedef void (*fFreeFun)(void*); | |
67 | -typedef int (*fMarkFun)(void*); | |
66 | +enum eLineField { kLF, kCRLF, kCR, kBel }; | |
67 | +extern enum eLineField gLineField; | |
68 | +extern enum eKanjiCode gKanjiCode; | |
69 | + | |
70 | +enum eAppType { kATOptC, kATXApp, kATConsoleApp }; | |
71 | + // Application kind | |
72 | + | |
73 | +extern enum eAppType gAppType; | |
74 | + | |
75 | +struct _sObject; | |
76 | + | |
77 | +extern struct _sObject* gErrMsg; // error message | |
78 | + | |
79 | +extern struct _sObject* gStdin; | |
80 | +extern struct _sObject* gStdout; | |
81 | +extern struct _sObject* gStderr; | |
82 | + | |
83 | +void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script); | |
84 | +void xyzsh_final(); | |
68 | 85 | |
69 | 86 | typedef struct _list_it { |
70 | 87 | void* mItem; |
@@ -88,10 +105,6 @@ typedef struct _hash_it { | ||
88 | 105 | struct _hash_it* mNextIt; |
89 | 106 | } hash_it; |
90 | 107 | |
91 | -enum eLineField { kLF, kCRLF, kCR, kBel }; | |
92 | -extern enum eLineField gLineField; | |
93 | -extern enum eKanjiCode gKanjiCode; | |
94 | - | |
95 | 108 | typedef struct { |
96 | 109 | hash_it** mTable; |
97 | 110 | int mTableSize; |
@@ -116,15 +129,6 @@ typedef struct { | ||
116 | 129 | int mCount; |
117 | 130 | } vector_obj; |
118 | 131 | |
119 | -/* | |
120 | -typedef struct { | |
121 | - void** mTable; | |
122 | - int mTableSize; | |
123 | - | |
124 | - int mCount; | |
125 | -} stackframes_obj; | |
126 | -*/ | |
127 | - | |
128 | 132 | #define kFDKindFD 1 |
129 | 133 | #define kFDKindBuf 2 |
130 | 134 |
@@ -166,6 +170,8 @@ struct sStatment; | ||
166 | 170 | #define STATMENT_CONTEXTPIPE_NUMBER 0xFFFF |
167 | 171 | |
168 | 172 | #define STATMENT_COMMANDS_MAX 16 |
173 | +#define XYZSH_OPTION_MAX 32 | |
174 | +#define XYZSH_MESSAGES_MAX 8 | |
169 | 175 | |
170 | 176 | struct block_obj; |
171 | 177 | struct _sObject; |
@@ -175,9 +181,6 @@ typedef struct _option_hash_it { | ||
175 | 181 | char* mArg; |
176 | 182 | } option_hash_it; |
177 | 183 | |
178 | -#define XYZSH_OPTION_MAX 32 | |
179 | -#define XYZSH_MESSAGES_MAX 8 | |
180 | - | |
181 | 184 | enum eEnvKind { kEnv, kEnvBlock}; |
182 | 185 | |
183 | 186 | typedef struct { |
@@ -198,7 +201,6 @@ typedef struct { | ||
198 | 201 | } sEnv; |
199 | 202 | |
200 | 203 | #define REDIRECT_KIND 0xff |
201 | - | |
202 | 204 | #define REDIRECT_IN 0x1 |
203 | 205 | #define REDIRECT_APPEND 0x2 |
204 | 206 | #define REDIRECT_OUT 0x4 |
@@ -274,12 +276,11 @@ struct block_obj | ||
274 | 276 | struct _sObject; |
275 | 277 | struct _sRunInfo; |
276 | 278 | |
277 | -typedef struct // a function object can be treated as block_obj | |
279 | +typedef struct | |
278 | 280 | { |
279 | 281 | struct _sObject* mBlock; |
280 | 282 | |
281 | 283 | struct _sObject* mParent; |
282 | -// int mParentCount; | |
283 | 284 | |
284 | 285 | struct _sObject* mLocalObjects; |
285 | 286 | struct _sObject* mArgBlocks; |
@@ -288,19 +289,7 @@ typedef struct // a function object can be treated as block_obj | ||
288 | 289 | struct _sRunInfo* mRunInfo; |
289 | 290 | } fun_obj; |
290 | 291 | |
291 | -typedef struct // a function object can be treated as block_obj | |
292 | -{ | |
293 | - struct _sObject* mBlock; | |
294 | - | |
295 | - struct _sObject* mParent; | |
296 | -// int mParentCount; | |
297 | - | |
298 | - struct _sObject* mLocalObjects; | |
299 | - struct _sObject* mArgBlocks; | |
300 | - | |
301 | - option_hash_it* mOptions; | |
302 | - struct _sRunInfo* mRunInfo; | |
303 | -} class_obj; | |
292 | +typedef fun_obj class_obj; | |
304 | 293 | |
305 | 294 | typedef BOOL (*fXyzshNativeFun)(struct _sObject*, struct _sObject*, struct _sRunInfo*); |
306 | 295 |
@@ -328,7 +317,7 @@ typedef struct _uobject_it { | ||
328 | 317 | struct _uobject_it* mNextIt; |
329 | 318 | } uobject_it; |
330 | 319 | |
331 | -typedef struct { // a user object can be treated like a hash_obj | |
320 | +typedef struct { | |
332 | 321 | uobject_it** mTable; |
333 | 322 | int mTableSize; |
334 | 323 |
@@ -359,13 +348,18 @@ typedef struct { | ||
359 | 348 | int mCounter; |
360 | 349 | } memchecker_obj; |
361 | 350 | |
351 | +struct _sRunInfo; | |
352 | + | |
362 | 353 | typedef int (*fExtObjMarkFun)(struct _sObject* self); |
363 | 354 | typedef void (*fExtObjFreeFun)(void* self); |
355 | +typedef BOOL (*fExtObjMainFun)(void* self, struct _sObject* nextin, struct _sObject* nextout, struct _sRunInfo* runinfo); | |
364 | 356 | |
365 | 357 | typedef struct { |
366 | 358 | void* mObject; |
359 | + | |
367 | 360 | fExtObjMarkFun mMarkFun; |
368 | 361 | fExtObjFreeFun mFreeFun; |
362 | + fExtObjMainFun mMainFun; | |
369 | 363 | } external_obj; |
370 | 364 | |
371 | 365 | typedef struct { |
@@ -454,8 +448,15 @@ int stack_page_size(); | ||
454 | 448 | #include <xyzsh/block.h> |
455 | 449 | #include <xyzsh/curses.h> |
456 | 450 | |
457 | -sObject* extobj_new_from_gc(void* object, fExtObjMarkFun mark_fun, fExtObjFreeFun free_fun, BOOL user_object); | |
458 | -#define EXTOBJ_NEW_GC(o, o2, o3, o4) extobj_new_from_gc(o, o2, o3, o4) | |
451 | +sObject* extobj_new_from_gc(void* object, fExtObjMarkFun mark_fun, fExtObjFreeFun free_fun, fExtObjMainFun main_fun, BOOL user_object); | |
452 | +#define EXTOBJ_NEW_GC(o, o2, o3, o4, o5) extobj_new_from_gc(o, o2, o3, o4, o5) | |
453 | + | |
454 | +#define UOBJECT_NEW_GC(o, o2, o3, o4) uobject_new_from_gc(o, o2, o3, o4) | |
455 | +#define UOBJECT_NEW_STACK(o, o2, o3) uobject_new_from_stack(o, o2, o3) | |
456 | + | |
457 | +void uobject_delete_gc(sObject* self); | |
458 | +void uobject_delete_stack(sObject* self); | |
459 | +int uobject_gc_children_mark(sObject* self); | |
459 | 460 | |
460 | 461 | sObject* uobject_new_from_gc(int size, sObject* parent, char* name, BOOL user_object); |
461 | 462 | sObject* uobject_new_from_stack(int size, sObject* object, char* name); |
@@ -465,26 +466,70 @@ void uobject_root_init(sObject* self); | ||
465 | 466 | void uobject_put(sObject* self, char* key, void* item); |
466 | 467 | void* uobject_item(sObject* self, char* key); |
467 | 468 | void uobject_clear(sObject* self); |
468 | - | |
469 | 469 | uobject_it* uobject_loop_begin(sObject* self); |
470 | 470 | void* uobject_loop_item(uobject_it* it); |
471 | 471 | char* uobject_loop_key(uobject_it* it); |
472 | 472 | uobject_it* uobject_loop_next(uobject_it* it); |
473 | 473 | int uobject_count(sObject* self); |
474 | 474 | |
475 | -#define UOBJECT_NEW_GC(o, o2, o3, o4) uobject_new_from_gc(o, o2, o3, o4) | |
476 | -#define UOBJECT_NEW_STACK(o, o2, o3) uobject_new_from_stack(o, o2, o3) | |
477 | - | |
478 | -void uobject_delete_gc(sObject* self); | |
479 | -void uobject_delete_stack(sObject* self); | |
480 | -int uobject_gc_children_mark(sObject* self); | |
481 | - | |
482 | 475 | sObject* external_prog_new_from_gc(char* path, BOOL user_object); |
483 | 476 | void external_prog_delete_gc(); |
484 | 477 | |
485 | 478 | #define EXTPROG_NEW_GC(o, o2) external_prog_new_from_gc(o, o2) |
486 | 479 | |
487 | -/// structure used from run, which contains run time info | |
480 | +sObject* memchecker_new_from_stack(int size); | |
481 | +void memchecker_delete_stack(sObject* self); | |
482 | + | |
483 | +#define MEMCHECKER_NEW_STACK(o) memchecker_new_from_stack(o) | |
484 | + | |
485 | +void memchecker_put(sObject* self, void* key, int item); | |
486 | +BOOL memchecker_erase(sObject* self, void* key); | |
487 | +int memchecker_item(sObject* self, void* key); | |
488 | + | |
489 | +sObject* completion_new_from_gc(sObject* block, BOOL user_object); | |
490 | +int completion_gc_children_mark(sObject* self); | |
491 | + | |
492 | +#define COMPLETION_NEW_GC(o, o2) completion_new_from_gc(o, o2) | |
493 | + | |
494 | +sObject* nfun_new_from_gc(fXyzshNativeFun fun, sObject* parent, BOOL user_object); | |
495 | +#define NFUN_NEW_GC(o, o2, o3) nfun_new_from_gc(o, o2, o3) | |
496 | +int nfun_gc_children_mark(sObject* self); | |
497 | +void nfun_delete_gc(sObject* self); | |
498 | +BOOL nfun_put_option_with_argument(sObject* self, MANAGED char* key); | |
499 | +BOOL nfun_option_with_argument_item(sObject* self, char* key); | |
500 | + | |
501 | +sObject* fun_new_from_gc(sObject* parent, BOOL user_object); | |
502 | +#define FUN_NEW_GC(o, o2) fun_new_from_gc(o, o2) | |
503 | +void fun_delete_gc(sObject* self); | |
504 | +int fun_gc_children_mark(sObject* self); | |
505 | +#define FUN_NEW_STACK(o) fun_new_from_stack(o) | |
506 | +sObject* fun_new_from_stack(sObject* parent); | |
507 | +void fun_delete_stack(sObject* self); | |
508 | +BOOL fun_put_option_with_argument(sObject* self, MANAGED char* key); | |
509 | +BOOL fun_option_with_argument_item(sObject* self, char* key); | |
510 | + | |
511 | +sObject* class_new_from_gc(sObject* parent, BOOL user_object); | |
512 | +#define CLASS_NEW_GC(o, o2) class_fun_new_from_gc(o, o2) | |
513 | +void class_delete_gc(sObject* self); | |
514 | +void class_delete_stack(sObject* self); | |
515 | +BOOL class_option_with_argument_item(sObject* self, char* key); | |
516 | +BOOL class_put_option_with_argument(sObject* self, MANAGED char* key); | |
517 | +int class_gc_children_mark(sObject* self); | |
518 | + | |
519 | +sObject* fd_new_from_stack(); | |
520 | +void fd_delete_stack(sObject* self); | |
521 | +#define FD_NEW_STACK(kind, fd) fd_new_from_stack(kind, fd) | |
522 | +BOOL fd_write(sObject* self, char* str, int size); | |
523 | + | |
524 | +void fd_split(sObject* self, enum eLineField lf); | |
525 | +BOOL fd_guess_lf(sObject* self, enum eLineField* lf); | |
526 | + | |
527 | +sObject* job_new_from_gc(char* name, pid_t pgroup, struct termios tty); | |
528 | +#define JOB_NEW_GC(o, o2, o3) job_new_from_gc(o, o2, o3) | |
529 | +void job_delete_gc(sObject* self); | |
530 | +void job_push_back_child_pid(sObject* self, pid_t pid); | |
531 | + | |
532 | +/// structure used from run function, which contains run time info | |
488 | 533 | typedef struct _sRunInfo { |
489 | 534 | char* mSName; |
490 | 535 | int mSLine; |
@@ -499,18 +544,13 @@ typedef struct _sRunInfo { | ||
499 | 544 | sObject* mRecieverObject; |
500 | 545 | } sRunInfo; |
501 | 546 | |
547 | +BOOL xyzsh_rehash(char* sname, int sline); | |
548 | + | |
502 | 549 | typedef BOOL (*fInternalCommand)(sObject*, sObject*, sRunInfo*); |
503 | 550 | |
504 | 551 | extern fInternalCommand kInternalCommands[kInnerCommand]; |
505 | 552 | extern char * gCommandKindStrs[kCommandMax]; |
506 | 553 | |
507 | -extern sObject* gObjectsInPipe; | |
508 | - | |
509 | -BOOL xyzsh_rehash(char* sname, int sline); | |
510 | - | |
511 | -#if defined(HAVE_MIGEMO_H) | |
512 | -BOOL cmd_migemo_match(sObject* nextin, sObject* nextout, sRunInfo* runinfo); | |
513 | -#endif | |
514 | 554 | BOOL cmd_kanjicode(sObject* nextin, sObject* nextout, sRunInfo* runinfo); |
515 | 555 | BOOL cmd_defined(sObject* nextin, sObject* nextout, sRunInfo* runinfo); |
516 | 556 | BOOL cmd_funinfo(sObject* nextin, sObject* nextout, sRunInfo* runinfo); |
@@ -639,38 +679,14 @@ BOOL cmd_condition_re(sObject* nextin, sObject* nextout, sRunInfo* runinfo); | ||
639 | 679 | BOOL cmd_sub(sObject* nextin, sObject* nextout, sRunInfo* runinfo); |
640 | 680 | BOOL cmd_time(sObject* nextin, sObject* nextout, sRunInfo* runinfo); |
641 | 681 | |
642 | -enum eAppType { kATOptC, kATXApp, kATConsoleApp }; | |
643 | - // Application kind | |
644 | - | |
645 | -extern enum eAppType gAppType; | |
646 | - | |
647 | -void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script); | |
648 | -void xyzsh_final(); | |
649 | - | |
650 | -void run_init(enum eAppType app_type); | |
651 | -void run_final(); | |
682 | +#if defined(HAVE_MIGEMO_H) | |
683 | +BOOL cmd_migemo_match(sObject* nextin, sObject* nextout, sRunInfo* runinfo); | |
684 | +#endif | |
652 | 685 | |
653 | 686 | BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* current_object, sObject* running_object); |
654 | -BOOL xyzsh(sObject* block, int* rcode); | |
655 | - | |
656 | -sObject* fd_new_from_stack(); | |
657 | -void fd_delete_stack(sObject* self); | |
658 | -#define FD_NEW_STACK(kind, fd) fd_new_from_stack(kind, fd) | |
659 | -BOOL fd_write(sObject* self, char* str, int size); | |
660 | - | |
661 | -sObject* job_new_from_gc(char* name, pid_t pgroup, struct termios tty); | |
662 | -#define JOB_NEW_GC(o, o2, o3) job_new_from_gc(o, o2, o3) | |
663 | -void job_delete_gc(sObject* self); | |
664 | -void job_push_back_child_pid(sObject* self, pid_t pid); | |
665 | - | |
666 | -extern sObject* gErrMsg; // error message | |
667 | 687 | |
668 | -extern sObject* gStdin; | |
669 | -extern sObject* gStdout; | |
670 | -extern sObject* gStderr; | |
671 | - | |
672 | -extern volatile BOOL gxyzshSigInt; | |
673 | -extern volatile BOOL gxyzshSigUser; | |
688 | +extern volatile BOOL gXyzshSigInt; | |
689 | +extern volatile BOOL gXyzshSigUser; | |
674 | 690 | |
675 | 691 | void xyzsh_restore_signal_default(); |
676 | 692 | void xyzsh_set_signal(); |
@@ -696,9 +712,6 @@ int gc_pool_size(); | ||
696 | 712 | int gc_used_objects_num(); |
697 | 713 | int gc_sweep(); |
698 | 714 | |
699 | -char* xstrncpy(char* src, char* des, int size); | |
700 | -char* xstrncat(char* src, char* des, int size); | |
701 | - | |
702 | 715 | BOOL parse(char* p, char* sname, int* sline, sObject* block, sObject** current_object); |
703 | 716 | |
704 | 717 | #define RCODE_BREAK 256 |
@@ -714,65 +727,19 @@ void xyzsh_kill_all_jobs(); | ||
714 | 727 | |
715 | 728 | extern sObject* gRootObject; |
716 | 729 | extern sObject* gCompletionObject; |
717 | -extern sObject* gxyzshObject; | |
730 | +extern sObject* gXyzshObject; | |
718 | 731 | extern sObject* gCurrentObject; |
719 | -extern sObject* gObject; // Object class object | |
720 | 732 | extern sObject* gStackFrames; |
733 | +extern sObject* gMemChecker; | |
734 | +extern sObject* gGlobalPipe; | |
735 | +extern sObject* gInheritObject; | |
721 | 736 | |
722 | 737 | BOOL bufsiz_write(int fd, char* buf, int buf_len); |
723 | 738 | |
724 | 739 | BOOL load_file(char* fname, sObject* nextin, sObject* nextout, sRunInfo* runinfo, char** argv, int argc); |
725 | -BOOL xyzsh_load_file(char* fname, char** argv, int argc, sObject* current_object); | |
726 | -void xyzsh_opt_c(char* cmd, char** argv, int argc); | |
727 | -void xyzsh_readline_interface(char* cmdline, int cursor, char** argv, int argc); | |
728 | - | |
729 | -void fd_split(sObject* self, enum eLineField lf); | |
730 | -BOOL fd_guess_lf(sObject* self, enum eLineField* lf); | |
731 | - | |
732 | -void err_msg(char* msg, char* sname, int line, char* command); | |
733 | -void err_msg_adding(char* msg, char* sname, int line, char* command); | |
734 | - | |
735 | -sObject* memchecker_new_from_stack(int size); | |
736 | -void memchecker_delete_stack(sObject* self); | |
737 | - | |
738 | -#define MEMCHECKER_NEW_STACK(o) memchecker_new_from_stack(o) | |
739 | - | |
740 | -void memchecker_put(sObject* self, void* key, int item); | |
741 | -BOOL memchecker_erase(sObject* self, void* key); | |
742 | -int memchecker_item(sObject* self, void* key); | |
743 | 740 | |
744 | 741 | int object_gc_children_mark(sObject* self); |
745 | 742 | |
746 | -sObject* completion_new_from_gc(sObject* block, BOOL user_object); | |
747 | -int completion_gc_children_mark(sObject* self); | |
748 | - | |
749 | -#define COMPLETION_NEW_GC(o, o2) completion_new_from_gc(o, o2) | |
750 | - | |
751 | -sObject* nfun_new_from_gc(fXyzshNativeFun fun, sObject* parent, BOOL user_object); | |
752 | -#define NFUN_NEW_GC(o, o2, o3) nfun_new_from_gc(o, o2, o3) | |
753 | -int nfun_gc_children_mark(sObject* self); | |
754 | -void nfun_delete_gc(sObject* self); | |
755 | -BOOL nfun_put_option_with_argument(sObject* self, MANAGED char* key); | |
756 | -BOOL nfun_option_with_argument_item(sObject* self, char* key); | |
757 | - | |
758 | -sObject* fun_new_from_gc(sObject* parent, BOOL user_object); | |
759 | -#define FUN_NEW_GC(o, o2) fun_new_from_gc(o, o2) | |
760 | -void fun_delete_gc(sObject* self); | |
761 | -int fun_gc_children_mark(sObject* self); | |
762 | -#define FUN_NEW_STACK(o) fun_new_from_stack(o) | |
763 | -sObject* fun_new_from_stack(sObject* parent); | |
764 | -void fun_delete_stack(sObject* self); | |
765 | -BOOL fun_put_option_with_argument(sObject* self, MANAGED char* key); | |
766 | -BOOL fun_option_with_argument_item(sObject* self, char* key); | |
767 | - | |
768 | -sObject* class_new_from_gc(sObject* parent, BOOL user_object); | |
769 | -#define CLASS_NEW_GC(o, o2) class_fun_new_from_gc(o, o2) | |
770 | -void class_delete_gc(sObject* self); | |
771 | -void class_delete_stack(sObject* self); | |
772 | -BOOL class_option_with_argument_item(sObject* self, char* key); | |
773 | -BOOL class_put_option_with_argument(sObject* self, MANAGED char* key); | |
774 | -int class_gc_children_mark(sObject* self); | |
775 | - | |
776 | 743 | BOOL sCommand_option_item(sCommand* self, char* key); |
777 | 744 | char* sCommand_option_with_argument_item(sCommand* self, char* key); |
778 | 745 | BOOL sCommand_put_option(sCommand* self, MANAGED char* key); |
@@ -782,56 +749,58 @@ BOOL sCommand_expand_env_redirect(sCommand* command, sObject* nextin, sRunInfo* | ||
782 | 749 | void sCommand_sweep_runtime_info(sCommand* command); |
783 | 750 | void sStatment_sweep_runtime_info(sStatment* self); |
784 | 751 | |
785 | -extern sObject* gMemChecker; | |
786 | - | |
787 | -extern FILE* gTest; | |
788 | - | |
789 | -extern sObject* gInherit; | |
790 | - | |
791 | -#define XYZSH_INHERIT_MAX 32 | |
792 | - | |
793 | -sObject* access_object(char* name, sObject** current, sObject* running_object); | |
794 | -sObject* access_object2(char* name, sObject* current, sObject* running_object); | |
795 | -sObject* access_object3(char* name, sObject** current); | |
796 | - | |
797 | 752 | BOOL run_function(sObject* fun, sObject* nextin, sObject* nextout, sRunInfo* runinfo, char** argv, int argc, sObject** blocks, int blocks_num); |
798 | 753 | |
799 | -extern sObject* gDirStack; | |
800 | - | |
801 | 754 | #define PARSER_MAGIC_NUMBER_ENV 3 |
802 | 755 | #define PARSER_MAGIC_NUMBER_OPTION 5 |
803 | 756 | |
804 | 757 | #include <oniguruma.h> |
805 | 758 | int get_onig_regex(regex_t** reg, sCommand* command, char* regex); |
806 | 759 | |
807 | -extern sObject* gPrompt; | |
808 | - | |
809 | -extern sObject* gGlobalPipe; | |
810 | - | |
811 | 760 | int readline_signal(); |
812 | 761 | void clear_matching_info_variable(); |
813 | - | |
814 | -BOOL xyzsh_readline_interface_onetime(int* rcode, char* cmdline, int cursor_point, char* source_name, char** argv, int argc, fXyzshJobDone xyzsh_job_done_); | |
815 | -char* xyzsh_job_title(int n); | |
816 | -int xyzsh_job_num(); | |
817 | -BOOL xyzsh_run(int* rcode, sObject* block, char* source_name, fXyzshJobDone xyzsh_job_done_, sObject* nextin, sObject* nextout, int argc, char** argv, sObject* current_object); | |
818 | - | |
819 | 762 | #include <stdarg.h> |
820 | - | |
821 | -void xyzsh_add_inner_command(sObject* object, char* name, fXyzshNativeFun command, int arg_num, ...); | |
822 | - | |
823 | -void readline_write_history(); | |
824 | -void readline_read_history(); | |
825 | 763 | void xyzsh_read_rc_core(char* path); |
826 | 764 | |
827 | -extern sObject* gStackFrames; | |
765 | +#define XYZSH_OBJECTS_IN_PIPE_MAX 128 | |
766 | + | |
767 | +void run_init(enum eAppType app_type); | |
768 | +void run_final(); | |
828 | 769 | |
829 | 770 | #if defined(HAVE_MIGEMO_H) |
830 | 771 | void migemo_init(); |
831 | 772 | void migemo_final(); |
832 | 773 | #endif |
833 | 774 | |
834 | -#define XYZSH_OBJECTS_IN_PIPE_MAX 128 | |
775 | +extern sObject* gPrompt; | |
776 | +extern sObject* gDirStack; | |
777 | + | |
778 | +void readline_write_history(); | |
779 | +void readline_read_history(); | |
780 | + | |
781 | +char* xstrncpy(char* src, char* des, int size); | |
782 | +char* xstrncat(char* src, char* des, int size); | |
783 | + | |
784 | +////////////////////////////////////////////////////////////////////// | |
785 | +// xyzsh API | |
786 | +////////////////////////////////////////////////////////////////////// | |
787 | +BOOL xyzsh_load_file(char* fname, char** argv, int argc, sObject* current_object); | |
788 | +void xyzsh_opt_c(char* cmd, char** argv, int argc); | |
789 | +void xyzsh_readline_interface(char* cmdline, int cursor, char** argv, int argc); | |
790 | + | |
791 | +void xyzsh_add_inner_command(sObject* object, char* name, fXyzshNativeFun command, int arg_num, ...); | |
792 | + | |
793 | +BOOL xyzsh_readline_interface_onetime(int* rcode, char* cmdline, int cursor_point, char* source_name, char** argv, int argc, fXyzshJobDone xyzsh_job_done_); | |
794 | +char* xyzsh_job_title(int n); | |
795 | +int xyzsh_job_num(); | |
796 | +BOOL xyzsh_run(int* rcode, sObject* block, char* source_name, fXyzshJobDone xyzsh_job_done_, sObject* nextin, sObject* nextout, int argc, char** argv, sObject* current_object); | |
797 | + | |
798 | +void err_msg(char* msg, char* sname, int line, char* command); | |
799 | +void err_msg_adding(char* msg, char* sname, int line, char* command); | |
800 | + | |
801 | +sObject* access_object(char* name, sObject** current, sObject* running_object); | |
802 | +sObject* access_object2(char* name, sObject* current, sObject* running_object); | |
803 | +sObject* access_object3(char* name, sObject** current); | |
835 | 804 | |
836 | 805 | #endif |
837 | 806 |