• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

シェルスクリプト言語xyzshのソースコード。


Commit MetaInfo

Revision495b4d49e7d5a9c549e0568491651c5d12fc9f62 (tree)
Time2013-01-04 01:04:40
Authorab25q <ab25cq@gmai...>
Commiterab25q

Log Message

1.2.8

Change Summary

Incremental Difference

--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,18 @@
11
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+
216 2012 12月20日 version 1.2.7
317
418 1. グロブの展開がパーサー時ではなくて実行時に起こるように変更。
--- a/Makefile.in
+++ b/Makefile.in
@@ -87,6 +87,12 @@ libxyzsh.dylib: libxyzsh.$(SO_VERSION).dylib
8787 cp libxyzsh.$(SO_VERSION).dylib libxyzsh.1.dylib
8888 cp libxyzsh.$(SO_VERSION).dylib libxyzsh.dylib
8989
90+permission:
91+ chmod 644 *
92+ chmod 755 .git man src configure
93+ chmod 644 src/*.c
94+ chmod 644 src/xyzsh/*.h
95+
9096 #########################################################
9197 # install
9298 #########################################################
--- a/README
+++ b/README
@@ -168,6 +168,9 @@ Files
168168 src/stack.c --> xyzsh stack object manager
169169 src/string.c --> string library
170170 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
171174
172175 LINCENSE
173176 MIT Lincense.
--- a/README.ja
+++ b/README.ja
@@ -207,15 +207,13 @@ xyzshが使用するファイル
207207 src/xyzsh.c --> xyzshのその他のルーチンを集めている
208208 src/readline.c --> readlineを扱っているソース。
209209 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のスタックを扱う実装。
216211 src/string.c --> 文字列ライブラリ
217212 src/uobject --> ユーザーオブジェクトの定義
218213 src/vector.c --> 動的配列の実装
214+ src/nfun.c --> ネイティブ関数オブジェクトの実装
215+ src/fd.c --> ファイル記述子オブジェクトの実装
216+ src/extprog.c --> 外部プログラムオブジェクトの実装
219217
220218 ラインセンス
221219
--- a/TODO
+++ b/TODO
@@ -2,4 +2,9 @@ Fedoraなど各環境でコンパイルと日本語を通したselectorのチェ
22
33 端末のサイズを変えたときに画面が乱れる mfiler4
44
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
--- a/USAGE.ja
+++ b/USAGE.ja
@@ -773,3 +773,11 @@
773773
774774 でコマンドの使い方を見ることができます。各コマンドのオプションなどはそちらで調べてください。
775775
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+
--- a/configure
+++ b/configure
@@ -3029,7 +3029,7 @@ SO_VERSION=1.5.5
30293029 { $as_echo "$as_me:${as_lineno-$LINENO}: checking Operating System" >&5
30303030 $as_echo_n "checking Operating System... " >&6; }
30313031
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"
30333033
30343034
30353035 if test `uname -s` = "Darwin"; then
--- a/configure.in
+++ b/configure.in
@@ -32,11 +32,11 @@ AC_SUBST(SYSTEM_MIGEMODIR)
3232 #####################################################################
3333 # check operating systems
3434 #####################################################################
35-SO_VERSION=1.5.5
35+SO_VERSION=1.5.6
3636 AC_SUBST(SO_VERSION)
3737 AC_MSG_CHECKING(Operating System)
3838
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"
4040 AC_SUBST(OBJ)
4141
4242 if test `uname -s` = "Darwin"; then
--- a/src/block.c
+++ b/src/block.c
@@ -1,4 +1,5 @@
11 #include "config.h"
2+
23 #include "xyzsh/xyzsh.h"
34 #include <string.h>
45 #include <stdio.h>
@@ -432,94 +433,6 @@ static void sCommand_copy_deeply_stack(sCommand* dest, sCommand* src)
432433 dest->mRedirectsFileNamesRuntime = NULL;
433434 }
434435
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-
523436 void sCommand_delete(sCommand* self)
524437 {
525438 int i;
@@ -568,59 +481,6 @@ void sCommand_delete(sCommand* self)
568481 }
569482 }
570483
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-
624484 void sCommand_view(sCommand* self)
625485 {
626486 printf("mArgsSize: %d\n", self->mArgsSize);
@@ -746,26 +606,6 @@ static void sStatment_copy_deeply_stack(sStatment* dest, sStatment* source)
746606 dest->mFlags = source->mFlags;
747607 }
748608
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-
769609 void sStatment_delete(sStatment* self)
770610 {
771611 int i;
@@ -775,15 +615,6 @@ void sStatment_delete(sStatment* self)
775615 if(self->mFName) FREE(self->mFName);
776616 }
777617
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-
787618 void sStatment_view(sStatment* self)
788619 {
789620 printf("mFlags ");
@@ -817,34 +648,6 @@ void sStatment_view(sStatment* self)
817648 }
818649 }
819650
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-
848651 sObject* block_new_from_gc(BOOL user_object)
849652 {
850653 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)
885688 return self;
886689 }
887690
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-
915691 sObject* block_clone_stack(sObject* source, int type)
916692 {
917693 sObject* self = stack_get_free_object(type);
@@ -974,19 +750,6 @@ void block_delete_stack(sObject* self)
974750 if(SBLOCK(self).mSource) FREE(SBLOCK(self).mSource);
975751 }
976752
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-
990753 //////////////////////////////////////////////////////////////////////////
991754 // some functions
992755 /////////////////////////////////////////////////////////////////////////
@@ -1407,6 +1170,7 @@ BOOL sCommand_expand_env(sCommand* command, sObject* fun, sObject* nextin, sObje
14071170 char** tails;
14081171 if(!expand_glob(expanded_str, ALLOC &head, ALLOC &tails, command, runinfo->mSName, runinfo->mSLine))
14091172 {
1173+ FREE(expanded_str);
14101174 return FALSE;
14111175 }
14121176 sCommand_add_arg_to_command2(command, MANAGED head);
@@ -1417,6 +1181,8 @@ BOOL sCommand_expand_env(sCommand* command, sObject* fun, sObject* nextin, sObje
14171181 }
14181182 FREE(tails);
14191183 }
1184+
1185+ FREE(expanded_str);
14201186 }
14211187 else {
14221188 char* expanded_str;
@@ -1498,6 +1264,8 @@ BOOL sCommand_expand_env_redirect(sCommand* command, sObject* nextin, sRunInfo*
14981264 p++;
14991265 }
15001266 FREE(tails);
1267+
1268+ FREE(expanded_str);
15011269 }
15021270 else {
15031271 command->mRedirectsFileNamesRuntime[i] = MANAGED expanded_str;
--- a/src/cmd_base.c
+++ b/src/cmd_base.c
@@ -486,7 +486,7 @@ BOOL cmd_msleep(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
486486 sCommand* command = runinfo->mCommand;
487487
488488 if(command->mArgsNumRuntime == 2) {
489- /// スミホマ ///
489+ /// ホゥ窶毒椎 ///
490490 char c [] = {'.', 'o', 'O'};
491491 int n = atoi(command->mArgsRuntime[1]);
492492 int i;
@@ -815,7 +815,7 @@ BOOL cmd_prompt(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
815815 sCommand* command = runinfo->mCommand;
816816 if(command->mBlocksNum == 1) {
817817 gPrompt = block_clone_gc(command->mBlocks[0], T_BLOCK, FALSE);
818- uobject_put(gxyzshObject, "_prompt", gPrompt);
818+ uobject_put(gXyzshObject, "_prompt", gPrompt);
819819 runinfo->mRCode = 0;
820820 }
821821
--- a/src/cmd_str.c
+++ b/src/cmd_str.c
@@ -410,8 +410,8 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
410410 char* result = NULL;
411411 if(sCommand_option_item(command, "-ignore-case")) {
412412 while(p < start_byte + strlen(start_byte)) {
413- if(gxyzshSigInt) {
414- gxyzshSigInt = FALSE;
413+ if(gXyzshSigInt) {
414+ gXyzshSigInt = FALSE;
415415 err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
416416 runinfo->mRCode = RCODE_SIGNAL_INTERRUPT;
417417 return FALSE;
@@ -432,8 +432,8 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
432432 }
433433 else {
434434 while(p < start_byte + strlen(start_byte)) {
435- if(gxyzshSigInt) {
436- gxyzshSigInt = FALSE;
435+ if(gXyzshSigInt) {
436+ gXyzshSigInt = FALSE;
437437 err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
438438 runinfo->mRCode = RCODE_SIGNAL_INTERRUPT;
439439 return FALSE;
@@ -471,7 +471,7 @@ BOOL cmd_index(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
471471 }
472472 }
473473
474- /// スミホマ ///
474+ /// ホゥ窶毒椎 ///
475475 if(!sCommand_option_item(command, "-quiet")) {
476476 if(!fd_write(nextout, msg, size)) {
477477 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
503503 break;
504504 }
505505
506- if(gxyzshSigInt) {
506+ if(gXyzshSigInt) {
507507 err_msg("interrupt", sname, sline, command);
508- gxyzshSigInt = FALSE;
508+ gXyzshSigInt = FALSE;
509509 return NULL;
510510 }
511511 }
@@ -542,8 +542,8 @@ static char* strcasestr_back(char* p, char* start, char* word, char* sname, int
542542 }
543543 }
544544
545- if(gxyzshSigInt) {
546- gxyzshSigInt = FALSE;
545+ if(gXyzshSigInt) {
546+ gXyzshSigInt = FALSE;
547547 err_msg("interrupt", sname, sline, command);
548548 return NULL;
549549 }
@@ -629,8 +629,8 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
629629 while(p>=target) {
630630 result = strcasestr_back(p, target, word, runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
631631
632- if(gxyzshSigInt) {
633- gxyzshSigInt = FALSE;
632+ if(gXyzshSigInt) {
633+ gXyzshSigInt = FALSE;
634634 err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
635635 runinfo->mRCode = RCODE_SIGNAL_INTERRUPT;
636636 return FALSE;
@@ -652,8 +652,8 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
652652 while(p>=target) {
653653 result = strstr_back(p, target, word, runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
654654
655- if(gxyzshSigInt) {
656- gxyzshSigInt = FALSE;
655+ if(gXyzshSigInt) {
656+ gXyzshSigInt = FALSE;
657657 err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
658658 runinfo->mRCode = RCODE_SIGNAL_INTERRUPT;
659659 return FALSE;
@@ -690,7 +690,7 @@ BOOL cmd_rindex(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
690690 }
691691 }
692692
693- /// スミホマ ///
693+ /// ホゥ窶毒椎 ///
694694 if(!sCommand_option_item(command, "-quiet")) {
695695 if(!fd_write(nextout, msg, size)) {
696696 err_msg("signal interrupt", runinfo->mSName, runinfo->mSLine, command->mArgs[0]);
--- /dev/null
+++ b/src/extprog.c
@@ -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+
--- /dev/null
+++ b/src/fd.c
@@ -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+}
--- a/src/gc.c
+++ b/src/gc.c
@@ -11,7 +11,7 @@ static sObject** gPool;
1111 static sObject* gFreeObjectHead;
1212 sObject* gRootObject;
1313 sObject* gCompletionObject;
14-sObject* gxyzshObject;
14+sObject* gXyzshObject;
1515 sObject* gCurrentObject;
1616 sObject* gMemChecker;
1717 sObject* gStackFrames;
@@ -203,21 +203,20 @@ void gc_init(int pool_size)
203203
204204 uobject_put(gRootObject, "compl", gCompletionObject);
205205
206- gxyzshObject = UOBJECT_NEW_GC(8, NULL, "xyzsh", FALSE);
206+ gXyzshObject = UOBJECT_NEW_GC(8, NULL, "xyzsh", FALSE);
207207 gStackFrames = VECTOR_NEW_GC(8, FALSE);
208- uobject_put(gxyzshObject, "_stackframes", gStackFrames);
208+ uobject_put(gXyzshObject, "_stackframes", gStackFrames);
209209 }
210210
211211 void gc_final()
212212 {
213213 /// sweep all user objects ///
214214 uobject_clear(gRootObject);
215- uobject_clear(gxyzshObject);
215+ uobject_clear(gXyzshObject);
216216 if(gAppType == kATConsoleApp) {
217217 printf("sweeped %d objects...\n", gc_sweep());
218218 }
219219
220- /// delete container ///
221220 int i;
222221 for(i=0; i<gPoolSize; i++) {
223222 sObject* p = gPool[i];
@@ -232,42 +231,6 @@ void gc_final()
232231 FREE(gPool);
233232 }
234233
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-
271234 static int mark()
272235 {
273236 int i;
@@ -284,8 +247,8 @@ static int mark()
284247 gRootObject->mFlg |= GC_MARK;
285248 int count = uobject_gc_children_mark(gRootObject);
286249
287- gxyzshObject->mFlg |= GC_MARK;
288- count += uobject_gc_children_mark(gxyzshObject);
250+ gXyzshObject->mFlg |= GC_MARK;
251+ count += uobject_gc_children_mark(gXyzshObject);
289252
290253 return count;
291254 }
--- a/src/hash.c
+++ b/src/hash.c
@@ -1,7 +1,6 @@
11 #include "config.h"
22 #include <stdio.h>
33 #include <string.h>
4-#include <assert.h>
54 #include "xyzsh/xyzsh.h"
65
76 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)
9392
9493 void hash_delete_gc(sObject* self)
9594 {
96- assert(TYPE(self) == T_HASH);
95+ ASSERT(TYPE(self) == T_HASH);
96+
9797 hash_it* it = SHASH(self).mEntryIt;
9898
9999 while(it) {
@@ -107,7 +107,8 @@ void hash_delete_gc(sObject* self)
107107
108108 void hash_delete_stack(sObject* self)
109109 {
110- assert(TYPE(self) == T_HASH);
110+ ASSERT(TYPE(self) == T_HASH);
111+
111112 hash_it* it = SHASH(self).mEntryIt;
112113
113114 while(it) {
@@ -121,7 +122,8 @@ void hash_delete_stack(sObject* self)
121122
122123 void hash_delete_malloc(sObject* self)
123124 {
124- assert(TYPE(self) == T_HASH);
125+ ASSERT(TYPE(self) == T_HASH);
126+
125127 hash_it* it = SHASH(self).mEntryIt;
126128
127129 while(it) {
@@ -137,7 +139,7 @@ void hash_delete_malloc(sObject* self)
137139
138140 static unsigned int get_hash_value(sObject* self, char* key)
139141 {
140- assert(TYPE(self) == T_HASH);
142+ ASSERT(TYPE(self) == T_HASH);
141143
142144 unsigned int i = 0;
143145 while(*key) {
@@ -150,7 +152,8 @@ static unsigned int get_hash_value(sObject* self, char* key)
150152
151153 static void resize(sObject* self)
152154 {
153- assert(TYPE(self) == T_HASH);
155+ ASSERT(TYPE(self) == T_HASH);
156+
154157 const int table_size = SHASH(self).mTableSize;
155158
156159 SHASH(self).mTableSize *= 5;
@@ -172,7 +175,7 @@ static void resize(sObject* self)
172175
173176 void hash_put(sObject* self, char* key, void* item)
174177 {
175- assert(TYPE(self) == T_HASH);
178+ ASSERT(TYPE(self) == T_HASH);
176179
177180 if(SHASH(self).mCounter >= SHASH(self).mTableSize) {
178181 resize(self);
@@ -199,7 +202,8 @@ void hash_put(sObject* self, char* key, void* item)
199202
200203 static void erase_from_list(sObject* self, hash_it* rit)
201204 {
202- assert(TYPE(self) == T_HASH);
205+ ASSERT(TYPE(self) == T_HASH);
206+
203207 if(rit == SHASH(self).mEntryIt) {
204208 SHASH(self).mEntryIt = rit->mNextIt;
205209 }
@@ -219,7 +223,8 @@ static void erase_from_list(sObject* self, hash_it* rit)
219223
220224 BOOL hash_erase(sObject* self, char* key)
221225 {
222- assert(TYPE(self) == T_HASH);
226+ ASSERT(TYPE(self) == T_HASH);
227+
223228 const unsigned int hash_value = get_hash_value(self, key);
224229 hash_it* it = SHASH(self).mTable[hash_value];
225230
@@ -260,7 +265,8 @@ BOOL hash_erase(sObject* self, char* key)
260265
261266 void hash_clear(sObject* self)
262267 {
263- assert(TYPE(self) == T_HASH);
268+ ASSERT(TYPE(self) == T_HASH);
269+
264270 int i;
265271 int max;
266272 hash_it* it = SHASH(self).mEntryIt;
@@ -279,7 +285,8 @@ void hash_clear(sObject* self)
279285
280286 void hash_replace(sObject* self, char* key, void* item)
281287 {
282- assert(TYPE(self) == T_HASH);
288+ ASSERT(TYPE(self) == T_HASH);
289+
283290 hash_it* it = SHASH(self).mTable[get_hash_value(self, key)];
284291
285292 if(it) {
@@ -296,7 +303,7 @@ void hash_replace(sObject* self, char* key, void* item)
296303
297304 void hash_show(sObject* self, char* fname)
298305 {
299- assert(TYPE(self) == T_HASH);
306+ ASSERT(TYPE(self) == T_HASH);
300307
301308 char tmp[8096];
302309 int i;
@@ -333,7 +340,7 @@ void hash_show(sObject* self, char* fname)
333340
334341 void* hash_item(sObject* self, char* key)
335342 {
336- assert(TYPE(self) == T_HASH);
343+ ASSERT(TYPE(self) == T_HASH);
337344
338345 hash_it* it = SHASH(self).mTable[ get_hash_value(self, key) ];
339346
@@ -347,7 +354,7 @@ void* hash_item(sObject* self, char* key)
347354
348355 void* hash_item_addr(sObject* self, char* key)
349356 {
350- assert(TYPE(self) == T_HASH);
357+ ASSERT(TYPE(self) == T_HASH);
351358
352359 hash_it* it = SHASH(self).mTable[ get_hash_value(self, key) ];
353360 while(it) {
@@ -360,7 +367,7 @@ void* hash_item_addr(sObject* self, char* key)
360367
361368 char* hash_key(sObject* self, void* item)
362369 {
363- assert(TYPE(self) == T_HASH);
370+ ASSERT(TYPE(self) == T_HASH);
364371
365372 hash_it* it = SHASH(self).mEntryIt;
366373
@@ -374,14 +381,14 @@ char* hash_key(sObject* self, void* item)
374381
375382 int hash_count(sObject* self)
376383 {
377- assert(TYPE(self) == T_HASH);
384+ ASSERT(TYPE(self) == T_HASH);
378385
379386 return SHASH(self).mCounter;
380387 }
381388
382389 hash_it* hash_loop_begin(sObject* self)
383390 {
384- assert(TYPE(self) == T_HASH);
391+ ASSERT(TYPE(self) == T_HASH);
385392
386393 return SHASH(self).mEntryIt;
387394 }
@@ -403,7 +410,7 @@ hash_it* hash_loop_next(hash_it* it)
403410
404411 int hash_gc_children_mark(sObject* self)
405412 {
406- assert(TYPE(self) == T_HASH);
413+ ASSERT(TYPE(self) == T_HASH);
407414
408415 int count = 0;
409416
--- a/src/interface.c
+++ b/src/interface.c
@@ -63,7 +63,7 @@ static char* prompt()
6363 xyzsh_set_signal();
6464
6565 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);
6767 vector_add(gStackFrames, stackframe);
6868 //uobject_init(stackframe);
6969 SFUN(fun).mLocalObjects = stackframe;
@@ -109,7 +109,7 @@ BOOL xyzsh_run(int* rcode, sObject* block, char* source_name, fXyzshJobDone xyzs
109109 xyzsh_set_signal();
110110
111111 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);
113113 vector_add(gStackFrames, stackframe);
114114 //uobject_init(stackframe);
115115 SFUN(fun).mLocalObjects = stackframe;
@@ -269,7 +269,7 @@ BOOL xyzsh_readline_interface_onetime(int* rcode, char* cmdline, int cursor_poin
269269 xyzsh_set_signal();
270270
271271 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);
273273 vector_add(gStackFrames, stackframe);
274274 //uobject_init(stackframe);
275275 SFUN(fun).mLocalObjects = stackframe;
@@ -429,7 +429,7 @@ void xyzsh_readline_interface(char* cmdline, int cursor_point, char** argv, int
429429 xyzsh_set_signal();
430430
431431 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);
433433 vector_add(gStackFrames, stackframe);
434434 //uobject_init(stackframe);
435435 SFUN(fun).mLocalObjects = stackframe;
@@ -539,7 +539,7 @@ void xyzsh_opt_c(char* cmd, char** argv, int argc)
539539 xyzsh_set_signal_optc();
540540
541541 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);
543543 vector_add(gStackFrames, stackframe);
544544 //uobject_init(stackframe);
545545 SFUN(fun).mLocalObjects = stackframe;
--- /dev/null
+++ b/src/nfun.c
@@ -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+
--- a/src/object.c
+++ b/src/object.c
@@ -3,103 +3,6 @@
33 #include <string.h>
44 #include <stdio.h>
55
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-
1036 sObject* access_object(char* name, sObject** current, sObject* running_object)
1047 {
1058 sObject* object;
@@ -137,29 +40,3 @@ sObject* access_object3(char* name, sObject** current)
13740 *current = SUOBJECT((*current)).mParent;
13841 }
13942 }
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-
--- a/src/parser.c
+++ b/src/parser.c
@@ -256,7 +256,6 @@ static BOOL read_env(char** p, sBuf* buf, char* sname, int* sline, BOOL expand_q
256256
257257 static BOOL add_argument_to_command(sBuf* buf, sCommand* command, char* sname, int* sline);
258258
259-/// 一単語読み込み
260259 static BOOL read_one_argument(char** p, sBuf* buf, char* sname, int* sline, BOOL expand_quote, sCommand* command, sObject* block, sObject** current_object)
261260 {
262261 BOOL squote = FALSE;
@@ -381,7 +380,7 @@ static BOOL read_one_argument(char** p, sBuf* buf, char* sname, int* sline, BOOL
381380 return FALSE;
382381 }
383382 }
384- else if(gxyzshSigInt) {
383+ else if(gXyzshSigInt) {
385384 err_msg("signal interrupt", sname, *sline, "here document");
386385 return FALSE;
387386 }
@@ -655,7 +654,6 @@ void tilda_expasion(char* file, ALLOC char** file2)
655654 *file2 = STRDUP(result);
656655 }
657656
658-
659657 static BOOL read_statment(char**p, sStatment* statment, sObject* block, char* sname, int* sline, sObject** current_object);
660658
661659 // result --> TRUE: success
@@ -1012,7 +1010,7 @@ static BOOL read_statment(char**p, sStatment* statment, sObject* block, char* sn
10121010 }
10131011
10141012 // 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
10161014 BOOL parse(char* p, char* sname, int* sline, sObject* block, sObject** current_object)
10171015 {
10181016 SBLOCK(block).mSource = STRDUP(p);
--- a/src/readline.c
+++ b/src/readline.c
@@ -570,7 +570,7 @@ char** readline_on_complete(const char* text, int start, int end)
570570 sObject* nextout = FD_NEW_STACK(kFDKindBuf, 0);
571571
572572 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);
574574 vector_add(gStackFrames, stackframe);
575575 //uobject_init(stackframe);
576576 SFUN(fun).mLocalObjects = stackframe;
@@ -722,7 +722,7 @@ BOOL cmd_completion(sObject* nextin, sObject* nextout, sRunInfo* runinfo)
722722 stack_start_stack();
723723
724724 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);
726726 vector_add(gStackFrames, stackframe);
727727 //uobject_init(stackframe);
728728 SFUN(fun).mLocalObjects = stackframe;
@@ -877,7 +877,7 @@ static int readline_macro(int count, int key)
877877 xyzsh_set_signal();
878878
879879 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);
881881 vector_add(gStackFrames, stackframe);
882882 //uobject_init(stackframe);
883883 SFUN(fun).mLocalObjects = stackframe;
--- a/src/run.c
+++ b/src/run.c
@@ -25,7 +25,9 @@ sObject* gStderr;
2525
2626 sObject* gGlobalPipe;
2727
28-sObject* gObjectsInPipe;
28+static sObject* gObjectsInPipe;
29+
30+static sObject* gRunningObjects;
2931
3032 BOOL add_object_to_objects_in_pipe(sObject* object, sRunInfo* runinfo, sCommand* command)
3133 {
@@ -53,7 +55,7 @@ void run_init(enum eAppType app_type)
5355 gStdout = FD_NEW_STACK(kFDKindBuf, 0);
5456 gStderr = FD_NEW_STACK(kFDKindBuf, 0);
5557 gJobs = VECTOR_NEW_GC(16, FALSE);
56- uobject_put(gxyzshObject, "_jobs", gJobs);
58+ uobject_put(gXyzshObject, "_jobs", gJobs);
5759
5860 xyzsh_job_done = NULL;
5961
@@ -63,345 +65,14 @@ void run_init(enum eAppType app_type)
6365 gGlobalPipe = FD_NEW_STACK(kFDKindBuf, 0);
6466
6567 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);
38169
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);
38972 }
39073
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()
39475 {
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;
40576 }
40677
40778 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,
42697 {
42798 char buf[BUFSIZ+1];
42899 while(1) {
429- if(gxyzshSigInt) {
100+ if(gXyzshSigInt) {
430101 err_msg("signal interrupt1", runinfo->mSName, runinfo->mSLine, program);
431- gxyzshSigInt = FALSE;
102+ gXyzshSigInt = FALSE;
432103 runinfo->mRCode = RCODE_SIGNAL_INTERRUPT;
433104 return FALSE;
434105 }
@@ -910,7 +581,7 @@ BOOL run_function(sObject* fun, sObject* nextin, sObject* nextout, sRunInfo* run
910581 sRunInfo* runinfo2 = SFUN(fun).mRunInfo;
911582 SFUN(fun).mRunInfo = runinfo;
912583
913- sObject* stackframe = UOBJECT_NEW_GC(8, gxyzshObject, "_stackframe", FALSE);
584+ sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE);
914585 vector_add(gStackFrames, stackframe);
915586 //uobject_init(stackframe);
916587 SFUN(fun).mLocalObjects = stackframe;
@@ -1130,6 +801,17 @@ static BOOL run_object(sObject* object, sObject* nextin, sObject* nextout, sRunI
1130801 }
1131802 break;
1132803
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+
1133815 default: {
1134816 char buf[BUFSIZ];
1135817 sCommand* command = runinfo->mCommand;
@@ -1393,7 +1075,7 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout
13931075 reciever = object;
13941076 object = uobject_item(object, command->mArgs[0]);
13951077
1396- if(object == gInherit) {
1078+ if(object == gInheritObject) {
13971079 sObject* running_object = runinfo->mRunningObject;
13981080
13991081 if(runinfo->mRunningObject) {
@@ -1459,7 +1141,7 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout
14591141 sObject* reciever = current_object;
14601142 sObject* object = access_object(command->mArgs[0], &reciever, runinfo->mRunningObject);
14611143
1462- if(object == gInherit) {
1144+ if(object == gInheritObject) {
14631145 sObject* running_object = runinfo->mRunningObject;
14641146
14651147 if(runinfo->mRunningObject) {
@@ -1546,6 +1228,9 @@ static BOOL statment_tree(sStatment* statment, sObject* pipein, sObject* pipeout
15461228
15471229 BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject* current_object, sObject* running_object)
15481230 {
1231+ vector_add(gRunningObjects, running_object); // for marking on gc
1232+ vector_add(gRunningObjects, block); // for marking on gc
1233+
15491234 static unsigned int n = 0;
15501235 static int nest_level = 0;
15511236 nest_level++;
@@ -1559,6 +1244,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
15591244 }
15601245 nest_level--;
15611246
1247+ (void)vector_pop_back(gRunningObjects);
1248+ (void)vector_pop_back(gRunningObjects);
15621249 return FALSE;
15631250 }
15641251
@@ -1594,6 +1281,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
15941281
15951282 if(!(n++ % 32)) (void)gc_sweep();
15961283
1284+ (void)vector_pop_back(gRunningObjects);
1285+ (void)vector_pop_back(gRunningObjects);
15971286 return FALSE;
15981287 }
15991288
@@ -1612,6 +1301,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
16121301 vector_clear(gObjectsInPipe);
16131302 }
16141303 if(!(n++ % 32)) (void)gc_sweep();
1304+ (void)vector_pop_back(gRunningObjects);
1305+ (void)vector_pop_back(gRunningObjects);
16151306 return FALSE;
16161307 }
16171308 }
@@ -1630,13 +1321,15 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
16301321 vector_clear(gObjectsInPipe);
16311322 }
16321323 if(!(n++ % 32)) (void)gc_sweep();
1324+ (void)vector_pop_back(gRunningObjects);
1325+ (void)vector_pop_back(gRunningObjects);
16331326 return FALSE;
16341327 }
16351328 }
16361329
16371330 /// the end of statment ///
1638- if(gxyzshSigUser) {
1639- gxyzshSigUser = FALSE;
1331+ if(gXyzshSigUser) {
1332+ gXyzshSigUser = FALSE;
16401333 sCommand* command = runinfo.mCommand;
16411334 err_msg("command not found", runinfo.mSName, runinfo.mSLine, ""); //command->mArgs[0]);
16421335 stack_end_stack();
@@ -1647,10 +1340,12 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
16471340 vector_clear(gObjectsInPipe);
16481341 }
16491342 if(!(n++ % 32)) (void)gc_sweep();
1343+ (void)vector_pop_back(gRunningObjects);
1344+ (void)vector_pop_back(gRunningObjects);
16501345 return FALSE;
16511346 }
1652- else if(runinfo.mRCode == 128+SIGINT || gxyzshSigInt) {
1653- gxyzshSigInt = FALSE;
1347+ else if(runinfo.mRCode == 128+SIGINT || gXyzshSigInt) {
1348+ gXyzshSigInt = FALSE;
16541349 sCommand* command = runinfo.mCommand;
16551350 err_msg("signal interrupt15", runinfo.mSName, runinfo.mSLine, command->mArgs[0]);
16561351 *rcode = RCODE_SIGNAL_INTERRUPT;
@@ -1662,6 +1357,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
16621357 vector_clear(gObjectsInPipe);
16631358 }
16641359 if(!(n++ % 32)) (void)gc_sweep();
1360+ (void)vector_pop_back(gRunningObjects);
1361+ (void)vector_pop_back(gRunningObjects);
16651362 return FALSE;
16661363 }
16671364 else if((statment->mFlags & STATMENT_OROR) && runinfo.mRCode == 0) {
@@ -1692,6 +1389,8 @@ BOOL run(sObject* block, sObject* pipein, sObject* pipeout, int* rcode, sObject*
16921389 }
16931390 if(!(n++ % 32)) (void)gc_sweep();
16941391
1392+ (void)vector_pop_back(gRunningObjects);
1393+ (void)vector_pop_back(gRunningObjects);
16951394 return TRUE;
16961395 }
16971396
@@ -1880,7 +1579,7 @@ BOOL load_file(char* fname, sObject* nextin, sObject* nextout, sRunInfo* runinfo
18801579 FREE(buf);
18811580
18821581 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);
18841583 vector_add(gStackFrames, stackframe);
18851584 //uobject_init(stackframe);
18861585 SFUN(fun).mLocalObjects = stackframe;
--- a/src/string.c
+++ b/src/string.c
@@ -5,9 +5,9 @@
55 #include "config.h"
66 #include "xyzsh/xyzsh.h"
77
8-//////////////////////////////////////////////////////////////////////
8+////////////////////////////////////////////////////
99 // Initialization
10-//////////////////////////////////////////////////////////////////////
10+////////////////////////////////////////////////////
1111 #ifndef MDEBUG
1212 sObject* string_new_from_malloc(char* str)
1313 {
@@ -93,9 +93,9 @@ sObject* string_new_from_stack(char* str)
9393 return self;
9494 }
9595
96-//////////////////////////////////////////////////////////////////////
96+/////////////////////////////////////////////////////
9797 // Finalization
98-//////////////////////////////////////////////////////////////////////
98+/////////////////////////////////////////////////////
9999 void string_delete_malloc(sObject* self)
100100 {
101101 FREE(SSTRING(self).mStr);
@@ -113,9 +113,9 @@ void string_delete_stack(sObject* self)
113113 FREE(SSTRING(self).mStr);
114114 }
115115
116-//////////////////////////////////////////////////////////////////////
116+/////////////////////////////////////////////////////
117117 // Some functions
118-//////////////////////////////////////////////////////////////////////
118+/////////////////////////////////////////////////////
119119 void string_insert(sObject* self, int pos, char* str)
120120 {
121121 char* new_str;
--- a/src/uobject.c
+++ b/src/uobject.c
@@ -2,7 +2,6 @@
22 #include "xyzsh/xyzsh.h"
33 #include <string.h>
44 #include <stdio.h>
5-#include <assert.h>
65
76 static unsigned int get_uobject_value(sObject* self, char* key)
87 {
@@ -97,11 +96,11 @@ sObject* uobject_new_from_stack(int size, sObject* parent, char* name)
9796 return self;
9897 }
9998
100-sObject* gInherit;
99+sObject* gInheritObject;
101100
102101 void uobject_root_init(sObject* self)
103102 {
104- assert(TYPE(self) == T_UOBJECT);
103+ ASSERT(TYPE(self) == T_UOBJECT);
105104
106105 uobject_put(self, "unset", NFUN_NEW_GC(cmd_unset, NULL, TRUE));
107106 sObject* readline = UOBJECT_NEW_GC(8, self, "rl", TRUE);
@@ -136,8 +135,8 @@ void uobject_root_init(sObject* self)
136135 uobject_put(self, "write", NFUN_NEW_GC(cmd_write, NULL, TRUE));
137136 uobject_put(self, "quote", NFUN_NEW_GC(cmd_quote, NULL, TRUE));
138137 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);
141140 uobject_put(self, "eval", NFUN_NEW_GC(cmd_eval, NULL, TRUE));
142141 uobject_put(self, "object", NFUN_NEW_GC(cmd_object, NULL, TRUE));
143142 uobject_put(self, "pwo", NFUN_NEW_GC(cmd_pwo, NULL, TRUE));
@@ -276,7 +275,7 @@ void uobject_root_init(sObject* self)
276275
277276 void uobject_init(sObject* self)
278277 {
279- assert(TYPE(self) == T_UOBJECT);
278+ ASSERT(TYPE(self) == T_UOBJECT);
280279
281280 uobject_put(self, "run", NFUN_NEW_GC(cmd_mrun, NULL, FALSE));
282281 uobject_put(self, "self", self);
@@ -287,7 +286,7 @@ void uobject_init(sObject* self)
287286
288287 void uobject_delete_gc(sObject* self)
289288 {
290- assert(TYPE(self) == T_UOBJECT);
289+ ASSERT(TYPE(self) == T_UOBJECT);
291290
292291 uobject_it* it = SUOBJECT(self).mEntryIt;
293292
@@ -303,7 +302,7 @@ void uobject_delete_gc(sObject* self)
303302
304303 void uobject_delete_stack(sObject* self)
305304 {
306- assert(TYPE(self) == T_UOBJECT);
305+ ASSERT(TYPE(self) == T_UOBJECT);
307306
308307 uobject_it* it = SUOBJECT(self).mEntryIt;
309308
@@ -319,7 +318,7 @@ void uobject_delete_stack(sObject* self)
319318
320319 int uobject_gc_children_mark(sObject* self)
321320 {
322- assert(TYPE(self) == T_UOBJECT);
321+ ASSERT(TYPE(self) == T_UOBJECT);
323322
324323 int count = 0;
325324
@@ -342,7 +341,7 @@ int uobject_gc_children_mark(sObject* self)
342341
343342 void uobject_put(sObject* self, char* key, void* item)
344343 {
345- assert(TYPE(self) == T_UOBJECT);
344+ ASSERT(TYPE(self) == T_UOBJECT);
346345
347346 if(SUOBJECT(self).mCounter >= SUOBJECT(self).mTableSize) {
348347 resize(self);
@@ -369,7 +368,7 @@ void uobject_put(sObject* self, char* key, void* item)
369368
370369 void* uobject_item(sObject* self, char* key)
371370 {
372- assert(TYPE(self) == T_UOBJECT);
371+ ASSERT(TYPE(self) == T_UOBJECT);
373372
374373 uobject_it* it = SUOBJECT(self).mTable[ get_uobject_value(self, key) ];
375374
@@ -383,7 +382,7 @@ void* uobject_item(sObject* self, char* key)
383382
384383 void uobject_clear(sObject* self)
385384 {
386- assert(TYPE(self) == T_UOBJECT);
385+ ASSERT(TYPE(self) == T_UOBJECT);
387386
388387 int i;
389388 int max;
@@ -403,7 +402,7 @@ void uobject_clear(sObject* self)
403402
404403 uobject_it* uobject_loop_begin(sObject* self)
405404 {
406- assert(TYPE(self) == T_UOBJECT);
405+ ASSERT(TYPE(self) == T_UOBJECT);
407406
408407 return SUOBJECT(self).mEntryIt;
409408 }
@@ -425,14 +424,15 @@ uobject_it* uobject_loop_next(uobject_it* it)
425424
426425 int uobject_count(sObject* self)
427426 {
428- assert(TYPE(self) == T_UOBJECT);
427+ ASSERT(TYPE(self) == T_UOBJECT);
429428
430429 return SUOBJECT(self).mCounter;
431430 }
432431
433432 static void erase_from_list(sObject* self, uobject_it* rit)
434433 {
435- assert(TYPE(self) == T_UOBJECT);
434+ ASSERT(TYPE(self) == T_UOBJECT);
435+
436436 if(rit == SUOBJECT(self).mEntryIt) {
437437 SUOBJECT(self).mEntryIt = rit->mNextIt;
438438 }
@@ -452,7 +452,7 @@ static void erase_from_list(sObject* self, uobject_it* rit)
452452
453453 BOOL uobject_erase(sObject* self, char* key)
454454 {
455- assert(TYPE(self) == T_UOBJECT);
455+ ASSERT(TYPE(self) == T_UOBJECT);
456456 const unsigned int hash_value = get_uobject_value(self, key);
457457 uobject_it* it = SUOBJECT(self).mTable[hash_value];
458458
--- a/src/xyzsh.c
+++ b/src/xyzsh.c
@@ -9,10 +9,10 @@
99
1010 sObject* gErrMsg;
1111
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;
1616
1717 sObject* gDirStack;
1818
@@ -57,33 +57,6 @@ void xyzsh_read_rc_core(char* path)
5757 xyzsh_restore_signal_default();
5858 }
5959
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-
8760 static void xyzsh_read_rc()
8861 {
8962 char sys_rc_path[PATH_MAX];
@@ -108,14 +81,11 @@ static void xyzsh_read_rc()
10881 xyzsh_read_rc_core(help_rc_path);
10982 xyzsh_read_rc_core(completion_rc_path);
11083 xyzsh_read_rc_core(user_rc_path);
111-
112-
113-// uobject_put(gRootObject, "test", sTestObj_new("AAA", 1));
11484 }
11585
11686 void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script)
11787 {
118- setenv("XYZSH_VERSION", "1.2.7", 1);
88+ setenv("XYZSH_VERSION", "1.2.8", 1);
11989 setenv("XYZSH_DATAROOTDIR", DATAROOTDIR, 1);
12090
12191 setlocale(LC_ALL, "");
@@ -125,10 +95,10 @@ void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script)
12595
12696 gErrMsg = STRING_NEW_STACK("");
12797
128- gxyzshSigInt = FALSE;
129- gxyzshSigUser = FALSE;
130- gxyzshSigTstp = FALSE;
131- gxyzshSigCont = FALSE;
98+ gXyzshSigInt = FALSE;
99+ gXyzshSigUser = FALSE;
100+ gXyzshSigTstp = FALSE;
101+ gXyzshSigCont = FALSE;
132102
133103 xyzsh_set_signal_other = NULL;
134104
@@ -137,7 +107,7 @@ void xyzsh_init(enum eAppType app_type, BOOL no_runtime_script)
137107 xyzsh_readline_init(FALSE);
138108
139109 gDirStack = VECTOR_NEW_GC(10, FALSE);
140- uobject_put(gxyzshObject, "_dir_stack", gDirStack);
110+ uobject_put(gXyzshObject, "_dir_stack", gDirStack);
141111
142112 char* term_env = getenv("TERM");
143113 if(term_env != NULL && strcmp(term_env, "") != 0) {
@@ -199,7 +169,7 @@ void err_msg_adding(char* msg, char* sname, int line, char* command)
199169
200170 void sig_int()
201171 {
202- gxyzshSigInt = TRUE;
172+ gXyzshSigInt = TRUE;
203173
204174 #ifdef MDEBUG
205175 fprintf(stderr, "SIGINT!!\n");
@@ -208,7 +178,7 @@ fprintf(stderr, "SIGINT!!\n");
208178
209179 void sig_tstp()
210180 {
211- gxyzshSigInt = TRUE;
181+ gXyzshSigInt = TRUE;
212182 #ifdef MDEBUG
213183 fprintf(stderr, "SIGTSTP!!\n");
214184 #endif
@@ -217,7 +187,7 @@ fprintf(stderr, "SIGTSTP!!\n");
217187 void sig_int_optc()
218188 {
219189 sigchld_block(1);
220- gxyzshSigInt = TRUE;
190+ gXyzshSigInt = TRUE;
221191 //killpg(0, SIGINT);
222192 #ifdef MDEBUG
223193 //fprintf(stderr, "SIGINT!!\n");
@@ -245,7 +215,7 @@ void sig_cont_optc()
245215
246216 void sig_user()
247217 {
248- gxyzshSigUser = TRUE;
218+ gXyzshSigUser = TRUE;
249219 }
250220
251221 void sigchld_action(int signum, siginfo_t* info, void* ctx)
--- a/src/xyzsh/block.h
+++ b/src/xyzsh/block.h
@@ -1,14 +1,6 @@
11 #ifndef XYZSH_BLOCK_H
22 #define XYZSH_BLOCK_H
33
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-
124 sObject* block_new_from_gc(BOOL user_object);
135 #define BLOCK_NEW_GC(o) block_new_from_gc(o)
146
@@ -17,19 +9,15 @@ sObject* block_new_from_stack();
179
1810 sObject* block_clone_gc(sObject* source, int type, BOOL user_object);
1911 sObject* block_clone_stack(sObject* source, int type);
20-sObject* block_clone_malloc(sObject* source);
2112 int block_gc_children_mark(sObject* self);
2213
2314 void block_delete_stack(sObject* self);
2415 void block_delete_gc(sObject* self);
25-void block_delete_malloc(sObject* self);
2616
2717 sCommand* sCommand_new(sStatment* statment);
2818 void sStatment_delete(sStatment* self);
29-void sStatment_delete_malloc(sStatment* self);
3019 sStatment* sStatment_new(sObject* block, int sline, char* sname);
3120 void sCommand_delete(sCommand* self);
32-void sCommand_delete_malloc(sCommand* self);
3321
3422 void sCommand_add_arg_to_command(sCommand* self, MANAGED char* buf, int env, int glob);
3523 BOOL sCommand_add_message(sCommand* self, MANAGED char* message);
--- a/src/xyzsh/debug.h
+++ b/src/xyzsh/debug.h
@@ -6,6 +6,7 @@
66 #define XYZSH_DEBUG_H
77
88 #include <stdlib.h>
9+#include <assert.h>
910
1011 #define P(F, O) { FILE* fp = fopen(F, "a"); fprintf(fp, O); fprintf(fp, "\n"); fclose(fp); }
1112
@@ -19,6 +20,7 @@
1920 # define FREE(o) free(o)
2021 # define TIMER_BEGIN(msg)
2122 # define TIMER_END()
23+# define ASSERT(o)
2224
2325 #else
2426
@@ -42,6 +44,7 @@ void timer_count_end(const char* file, int line, const char* fun);
4244
4345 # define TIMER_BEGIN(msg) timer_count_start(msg)
4446 # define TIMER_END() timer_count_end(__FILE__, __LINE__, __FUNCTION__)
47+# define ASSERT(o) assert(o)
4548
4649 #endif
4750
--- a/src/xyzsh/xyzsh.h
+++ b/src/xyzsh/xyzsh.h
@@ -63,8 +63,25 @@ enum eCommandKind {
6363 kCommandMax
6464 };
6565
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();
6885
6986 typedef struct _list_it {
7087 void* mItem;
@@ -88,10 +105,6 @@ typedef struct _hash_it {
88105 struct _hash_it* mNextIt;
89106 } hash_it;
90107
91-enum eLineField { kLF, kCRLF, kCR, kBel };
92-extern enum eLineField gLineField;
93-extern enum eKanjiCode gKanjiCode;
94-
95108 typedef struct {
96109 hash_it** mTable;
97110 int mTableSize;
@@ -116,15 +129,6 @@ typedef struct {
116129 int mCount;
117130 } vector_obj;
118131
119-/*
120-typedef struct {
121- void** mTable;
122- int mTableSize;
123-
124- int mCount;
125-} stackframes_obj;
126-*/
127-
128132 #define kFDKindFD 1
129133 #define kFDKindBuf 2
130134
@@ -166,6 +170,8 @@ struct sStatment;
166170 #define STATMENT_CONTEXTPIPE_NUMBER 0xFFFF
167171
168172 #define STATMENT_COMMANDS_MAX 16
173+#define XYZSH_OPTION_MAX 32
174+#define XYZSH_MESSAGES_MAX 8
169175
170176 struct block_obj;
171177 struct _sObject;
@@ -175,9 +181,6 @@ typedef struct _option_hash_it {
175181 char* mArg;
176182 } option_hash_it;
177183
178-#define XYZSH_OPTION_MAX 32
179-#define XYZSH_MESSAGES_MAX 8
180-
181184 enum eEnvKind { kEnv, kEnvBlock};
182185
183186 typedef struct {
@@ -198,7 +201,6 @@ typedef struct {
198201 } sEnv;
199202
200203 #define REDIRECT_KIND 0xff
201-
202204 #define REDIRECT_IN 0x1
203205 #define REDIRECT_APPEND 0x2
204206 #define REDIRECT_OUT 0x4
@@ -274,12 +276,11 @@ struct block_obj
274276 struct _sObject;
275277 struct _sRunInfo;
276278
277-typedef struct // a function object can be treated as block_obj
279+typedef struct
278280 {
279281 struct _sObject* mBlock;
280282
281283 struct _sObject* mParent;
282-// int mParentCount;
283284
284285 struct _sObject* mLocalObjects;
285286 struct _sObject* mArgBlocks;
@@ -288,19 +289,7 @@ typedef struct // a function object can be treated as block_obj
288289 struct _sRunInfo* mRunInfo;
289290 } fun_obj;
290291
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;
304293
305294 typedef BOOL (*fXyzshNativeFun)(struct _sObject*, struct _sObject*, struct _sRunInfo*);
306295
@@ -328,7 +317,7 @@ typedef struct _uobject_it {
328317 struct _uobject_it* mNextIt;
329318 } uobject_it;
330319
331-typedef struct { // a user object can be treated like a hash_obj
320+typedef struct {
332321 uobject_it** mTable;
333322 int mTableSize;
334323
@@ -359,13 +348,18 @@ typedef struct {
359348 int mCounter;
360349 } memchecker_obj;
361350
351+struct _sRunInfo;
352+
362353 typedef int (*fExtObjMarkFun)(struct _sObject* self);
363354 typedef void (*fExtObjFreeFun)(void* self);
355+typedef BOOL (*fExtObjMainFun)(void* self, struct _sObject* nextin, struct _sObject* nextout, struct _sRunInfo* runinfo);
364356
365357 typedef struct {
366358 void* mObject;
359+
367360 fExtObjMarkFun mMarkFun;
368361 fExtObjFreeFun mFreeFun;
362+ fExtObjMainFun mMainFun;
369363 } external_obj;
370364
371365 typedef struct {
@@ -454,8 +448,15 @@ int stack_page_size();
454448 #include <xyzsh/block.h>
455449 #include <xyzsh/curses.h>
456450
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);
459460
460461 sObject* uobject_new_from_gc(int size, sObject* parent, char* name, BOOL user_object);
461462 sObject* uobject_new_from_stack(int size, sObject* object, char* name);
@@ -465,26 +466,70 @@ void uobject_root_init(sObject* self);
465466 void uobject_put(sObject* self, char* key, void* item);
466467 void* uobject_item(sObject* self, char* key);
467468 void uobject_clear(sObject* self);
468-
469469 uobject_it* uobject_loop_begin(sObject* self);
470470 void* uobject_loop_item(uobject_it* it);
471471 char* uobject_loop_key(uobject_it* it);
472472 uobject_it* uobject_loop_next(uobject_it* it);
473473 int uobject_count(sObject* self);
474474
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-
482475 sObject* external_prog_new_from_gc(char* path, BOOL user_object);
483476 void external_prog_delete_gc();
484477
485478 #define EXTPROG_NEW_GC(o, o2) external_prog_new_from_gc(o, o2)
486479
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
488533 typedef struct _sRunInfo {
489534 char* mSName;
490535 int mSLine;
@@ -499,18 +544,13 @@ typedef struct _sRunInfo {
499544 sObject* mRecieverObject;
500545 } sRunInfo;
501546
547+BOOL xyzsh_rehash(char* sname, int sline);
548+
502549 typedef BOOL (*fInternalCommand)(sObject*, sObject*, sRunInfo*);
503550
504551 extern fInternalCommand kInternalCommands[kInnerCommand];
505552 extern char * gCommandKindStrs[kCommandMax];
506553
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
514554 BOOL cmd_kanjicode(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
515555 BOOL cmd_defined(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
516556 BOOL cmd_funinfo(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
@@ -639,38 +679,14 @@ BOOL cmd_condition_re(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
639679 BOOL cmd_sub(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
640680 BOOL cmd_time(sObject* nextin, sObject* nextout, sRunInfo* runinfo);
641681
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
652685
653686 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
667687
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;
674690
675691 void xyzsh_restore_signal_default();
676692 void xyzsh_set_signal();
@@ -696,9 +712,6 @@ int gc_pool_size();
696712 int gc_used_objects_num();
697713 int gc_sweep();
698714
699-char* xstrncpy(char* src, char* des, int size);
700-char* xstrncat(char* src, char* des, int size);
701-
702715 BOOL parse(char* p, char* sname, int* sline, sObject* block, sObject** current_object);
703716
704717 #define RCODE_BREAK 256
@@ -714,65 +727,19 @@ void xyzsh_kill_all_jobs();
714727
715728 extern sObject* gRootObject;
716729 extern sObject* gCompletionObject;
717-extern sObject* gxyzshObject;
730+extern sObject* gXyzshObject;
718731 extern sObject* gCurrentObject;
719-extern sObject* gObject; // Object class object
720732 extern sObject* gStackFrames;
733+extern sObject* gMemChecker;
734+extern sObject* gGlobalPipe;
735+extern sObject* gInheritObject;
721736
722737 BOOL bufsiz_write(int fd, char* buf, int buf_len);
723738
724739 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);
743740
744741 int object_gc_children_mark(sObject* self);
745742
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-
776743 BOOL sCommand_option_item(sCommand* self, char* key);
777744 char* sCommand_option_with_argument_item(sCommand* self, char* key);
778745 BOOL sCommand_put_option(sCommand* self, MANAGED char* key);
@@ -782,56 +749,58 @@ BOOL sCommand_expand_env_redirect(sCommand* command, sObject* nextin, sRunInfo*
782749 void sCommand_sweep_runtime_info(sCommand* command);
783750 void sStatment_sweep_runtime_info(sStatment* self);
784751
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-
797752 BOOL run_function(sObject* fun, sObject* nextin, sObject* nextout, sRunInfo* runinfo, char** argv, int argc, sObject** blocks, int blocks_num);
798753
799-extern sObject* gDirStack;
800-
801754 #define PARSER_MAGIC_NUMBER_ENV 3
802755 #define PARSER_MAGIC_NUMBER_OPTION 5
803756
804757 #include <oniguruma.h>
805758 int get_onig_regex(regex_t** reg, sCommand* command, char* regex);
806759
807-extern sObject* gPrompt;
808-
809-extern sObject* gGlobalPipe;
810-
811760 int readline_signal();
812761 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-
819762 #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();
825763 void xyzsh_read_rc_core(char* path);
826764
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();
828769
829770 #if defined(HAVE_MIGEMO_H)
830771 void migemo_init();
831772 void migemo_final();
832773 #endif
833774
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);
835804
836805 #endif
837806