<<<<<<<<<<【不具合】>>>>>>>>>> [不具合] [原 因] [対 応] 2011.05.27 [不具合] "x++ putline('A')"がエラーにならず、putlineが文字演算子の扱いになる。 [原 因] 後置演算子が直前にある場合にチェック漏れ。 [対 応] チェックを追加した。 -->cl_gx_compile.c 2011.07.13 [不具合] 式において、配列要素(X[n])または関数(X(n))の後ろの文字演算子が位置不正エラーになる。 [原 因] 配列要素(X[n])または関数(X(n))の']',')'のattr0を2001にしており、 attr0>=2000 && attr0<3000で、文字演算子が来たときは、エラーにしている。 [対 応] 上記の場合は、5999(定数扱い)にし、_atr2name()は、da[998]のとき、"関数値or配列値"を 返すようにした。 -->cl_gx_compile.c 2011.07.15 [不具合] "0 IS('A','N')"がエラーにならない。 ==> 仕様 /************************ [原 因] 関数にするか文字演算子にするかの判定で、関数名の直前が、定数や変数のときは、 文字演算子にしている。"('A','N')"が2項演算の2項目になっている。 [対 応] 関数名の直後が'('のときは、関数とし、この判定の後に、演算子なしのエラーチェックを 追加した。 *************************/ [不具合] redefineで、属性がchar,bulkの配列サイズを変更すると、coreダンプする。 [原 因] alsize_oldを求める処理で、size_old=0のケースの判定が漏れ。 [対 応] cl_get_def_alsize()を使いように変更した。 -->clprdef.c [不具合] redefineで、属性がchar,bulkのとき、属性を変更しないと、coreダンプする。 [原 因] ケースの判定漏れ。上記のときも、size>0の場合の処理を行っておる。 [対 応] 属性が変更されないときは、配列情報構造体(tdtArrayIndex)へのポインタをコピーするのみにした。 -->clprdef.c 2011.07.19 [不具合] システム変数 STRING の値が不正である。 [原 因] 例外変数 STRING_EXCEPTION と認識されている。 例外変数のサーチ時の比較が、与えられた文字列のバイト数の前方一致になっている。 [対 応] 例外変数の文字列のバイト数と与えられた文字列のバイト数が等しいときのみ、比較する。 -->cl_anal_parm.c 2011.07.25 [不具合] スクリプト定義部分で、式にユーザ定義関数を指定すると、coreダンプする。 [原 因] 関数実行時のカレントプロック構造体へのポインター取得で、NULLチェック抜け。 [対 応] NULLの場合は、スクリプト実行エラーにする。 -->cl_execute_proc.c [不具合] inlike()実行で、no malloc error. [原 因] _pxlike_pos()の中で、"usap = plike->usap + sp"としているが、usapは、plikeが外から 与えられない関数のときに、plike->usapの値をstaticで持っていて、再利用している。 上記代入で値が変更され、_realloc()中のFree()でエラーとなった。 [対 応] usapをgusapに変更し、_pxlike_pos()の中では、usapをローカル変数として定義した。 --> akxslike.c 2011.08.03 [不具合] f()(a)が演算子なしエラーになる。 [原 因] f()の')'が定数扱いであり、'('の前が、システム変数または定数のときは、上記エラーにしている。 [対 応] f()の')'は、関数扱いに戻し、attr0は2999とする。 --> cl_gx_compile.c [不具合] "a ABS(-1)"がエラーにならない。 [原 因] ABSが二項演算子扱いになっている。 [対 応] 関数を二項演算子扱いになるものとならないものに分ける。(仕様変更) なるものはatr=61、ならないものはatr=62とする。 atr=62は、関数名2000番台にする。 --> cl_gx_compile.c cl_gx_exp_imd.c [不具合] データ属性DECの精度と位取りに変数を指定すると、精度に位取りの指定値が設定され、 位取りが無視される。 [原 因] DECの精度と位取りを取得するために、D_GX_OPT_PARMINFO2オプションを指定して、 "(a,b)"のaとbを取得している。 "(a,b)"は、括弧の処理で、D_AULN_PARMINFO2の形式に変換される。このとき、括弧内の 最後のデータを返却用データ情報構造体(pInfoParmW)にコピーし、D_AULN_PARMINFO2を 設定している。括弧処理の最後では、pInfoParmWを括弧処理の結果の値として設定している。 このとき、bが変数だと、bはS形式となっている。 式処理の最後で、データをD_GX_OPT_PARMINFO2形式に変換するとき、括弧処理の結果を 取り出すが、S形式のため、bの値そのものが取り出され、D_AULN_PARMINFO2の情報が失われる。 結果として、bの値(位取り)のみが返される。 [対 応] 括弧内の最後のデータを返却用データ情報構造体(pInfoParmW)にコピーする前に、S形式から 値そのもに変換する。 --> cl_gx_compile.c 2011.08.04 [不具合] A[0](-1)が演算子なしエラーになる。 [原 因] A[0]の']'が定数扱いであり、'('の前が、システム変数または定数のときは、上記エラーにしている。 [対 応] A[0]の']'は、変数扱いにし、attr0は3999とする。 --> cl_gx_compile.c 2011.08.12 [不具合] TOの'U','L'の結果の後ろに文字列が付く。 [原 因] 変換結果の後ろに'\0'が入っていない。 [対 応] 変換結果の後ろに'\0'を入れる。 --> akxlib.c 2011.08.17 [不具合] for eachで取得した連想配列のインデックスを同じ連想配列に指定してしても参照できない。 [原 因] インデックス中のバッククォート(`)にさらにバッククォート(`)が付くため。 [対 応] インデックス中のバッククォート(`)に関する仕様を変更。 --> cl_gx_exp_imd.c 2011.08.22 [不具合] STATICクラスの複数メソッドを順次実行すると、2つ目以降は最初に実行したメソッドが実行される。 [原 因] STATICクラスのメソッドを実行するときは、擬似インスタンスを生成して、このインスタンス情報を 使って、メソッド情報を生成する。擬似インスタンスは、そのクラス名でHASH管理している。 STATICクラスの擬似インスタンスをHASH登録するときに、名前をクラス名、データを最初に 実行したメソッドの情報を登録しており、2回目以降は、実行すべきメソッド情報として、 このHASH登録したメソッドの情報で実行していた。 [対 応] 擬似インスタンスの情報をHASH登録するようにし、このインスタンス情報を使って、メソッド 情報を生成するようにした。 --> cl_class.c 2011.08.26 [不具合] 文字定数('xxxxxx')が、コマンドなしで現れたとき、無視される。 [原 因] 文字定数は、無条件にパラメータ処理を行っており、その前に、コマンドがないとコマンドの パラメータとして設定されないため。2重引用符で囲まれた文字列も同じ。 [対 応] 区切り文字処理に変更した。 --> cl_cllex.c 2011.08.29 [不具合] 関数echo()で出力されるパラメータ間にスペースがない。 [原 因] カンマとスペースを出力する処理がない。 [対 応] 上記処理を追加した。 -->cl_user_func 2011.08.30 [不具合] BlockCBでFree()されないものがある。また、BlockCBが1つ余計にMalloc()される。 [原 因] loopのend処理では、BlockCBは、再利用するようにFree()せず、カレントCBを1つ前に設定するのみにしているが、 if,try,switchのend処理では、カレントCBをFree()しており、カレントCBの後にあるBlockCBが、未開放となっている。 また、BlockCBを追加する処理では、カレントCBがあり、その後ろに未使用のBlockCBが付いているとき、それを使用 するようになっており、先頭のBlockCBが再利用されていない。 [対 応] if,try,switchのend処理では、カレントCBをFree()しないようにした。 先頭のBlockCBが未使用になったときは、カレントCBへのポインタをNULLとして、先頭が未使用であることとした。 また、BlockCBを追加する処理を変更し、先頭のBlockCBが再利用されるようにした。 --> cl_ifpre_proc.c clprloop.c cl_process_end_if.c [不具合] ""がNULLパラメータとならない。 [原 因] 文字定数と2重引用符で囲まれた文字列の処理を区切り文字処理に変更したことで、""が無視されている。 区切り文字処理では、文字列長がゼロのときは、何もしないでリターンしている。 [対 応] コマンドモード(コマンド出現前)のときは、区切り文字処理を、パラメータモード(コマンド出現後)のときは、 パラメータ処理を呼び出すようにした。 --> cl_cllex.c [不具合] また、#=include文の次行のNULLパラメータ("")+セミコロン(;)行がエラーとなる。 [原 因] 区切り文字処理では、区切り文字がセミコロン(;)でコマンドがUNKNOWNでないとき、 コマンド行登録処理を呼び出している。また、#=xxxxxx文の後では、コマンドがPRAGMAになっている。 上記の場合、最初の区切り文字処理ではNULLパラメータが無視され、次に区切り文字処理で、 コマンド行登録処理を呼び出し、エラーとなっている。 [対 応] 区切り文字処理の始めで、コマンドモードのときは、コマンドをUNKNOWNにする。 2011.09.01 [不具合] リストのデータ数がゼロになったときにNULLリストにするオプションのとき、 NULLリストを要素に持つ配列をデータ指定でprintすると、"{**NIL**,}"となり、 不要なカンマが出力される。 [原 因] データ指定ありのリスト出力処理で、"{**NIL**,}"を出力している。 [対 応] データ指定なしのときとデータ指定ありのときのリスト出力処理を共通化して、 "{**NIL**}"を出力するようにした。 2011.09.09 [不具合] 外部変数の初期値設定(cl_pr_ex_def_scalar_attr_info()), proc()またはfunc()での%argv設定(cl_pr_ex_def_map_ary())でcoreダンプ。 [原 因] 変数名に指定された変数から変数名を取得する処理では、pprmp[0]->bxobjを使っているが、 上記処理では、pprmp[0]を設定していなかった。 [対 応] pprmp[0]を設定した。 --> clprproc.c cl_proc_bexp.c 2011.09.14 [不具合] TRYでreaddir()がEOF(返却値がNULL)になったときに、FILE_READ_END_EXCEPTIONにならない。 [原 因] 上記のときは、FILE_READ_EXCEPTIONにしていた。 [対 応] 上記でかつerrnoがゼロのときは、FILE_READ_END_EXCEPTIONにする。 errnoがゼロでないときは、FILE_READ_EXCEPTION+errnoにする。 --> clfuncfile.c 2011.09.16 [不具合] TRYでCATCHされてもエラーメッセージがクリアされない。 [原 因] CATCHされたときにクリアしていない。 [対 応] CATCHされたときにクリアする。 --> cl_process_end_if.c 2011.09.19 [不具合] INRSTR(),INIRSTR()において、一致位置が一番最後で一致した位置になっていない。 [原 因] 上記関数では、optの0x02ビットがONになっているが、0x20で判定していた。 [対 応] 0x02で判定するようにした。 --> cl_cmpt_comp.c 2011.09.27 [不具合] "インスタンス変数.メソッド名()"でメソッドが未定義のエラーになる。 [原 因] "インスタンス変数.メソッド名"を取得した時点でメソッド名がインスタンス変数名になっている。 インスタンス変数のInfoParmのデータとして変数名を設定するようにしたが、データ長を設定して いなかったため。 クラス名が"aaa"で3バイト、インスタンス変数名が"$x"で2バイト、データ長は3バイトのまま。 この状態で、"インスタンス変数名.メソッド名"の文字列を設定したが、インスタンス変数名長を 3バイトとしてその後ろに".メソッド名"を追加したために、インスタンス変数名の後ろにNULLが残り、 結果としてメソッド名がインスタンス変数名のみになってしまった。 [対 応] インスタンス変数のInfoParmのデータ長も設定する。 --> cl_gx_rep_prm_set.c 2011.10.05 [不具合] 関数の中で、ローカル配列(a)を定義して、スクリプト変数(y)にこの実体をコピー(private y = *a)し、 メインにもどって、yを参照すると、配列が無効というエラーになる。 [原 因] 実体をコピーする際に、yのアクセス属性に合わせてGIDを設定し直していない。 自分自身のアドレスを設定し直していない。 [対 応] @変数をコピーする関数で、pInfoParmの内容をコピーする前にコピー先のアクセス属性を保存しておき、  pInfoParmの内容コピー後に元に戻す。 A配列の実体をコピーした後に、コピー先のアクセス属性合わせてGIDを設定し直す。 B自分自身のアドレスを設定し直す。 --> cl_gx_rep_prm_set.c 2011.10.11 [不具合] mappedarrayの定義時の変数に$,#,%のどれも付けないとcoreダンプする。 [原 因] マップされる配列の範囲をチェックするときに、配列の定義情報をするために、$,#,%に対応する 変数情報格納表へのポインタを設定しているが、$,#,%のどれでもないと、NULLとなってしまう。 [対 応] $,#,%のどれでもないときは、先頭文字として、'$'を使用する。また、$,#,%に対応する変数情報格納表への ポインタを設定するときには、#,%以外のときは、'$'に対応する変数情報格納表へのポインタを 設定する。 --> clprdef.c 2011.10.19 [不具合] importを複数含むスクリプトを実行した際に、先頭のコマンド行の実行でエラーが起きたときの スクリプト名が他のimportしたスクリプト名になる。 [原 因] lex()では、行データにスクリプト名へのポインタを保存するエリアを確保し、スクリプト名への ポインタを保存する処理を、lex()の開始時とleaf作成後に呼んでいる。 その処理の中では当該エリアのポインタがNULLのときにエリアを確保している。 当該エリアのポインタは、lex()が最初に呼ばれたときと、leaf作成後にNULLになっている。 leaf作成後に、スクリプト名へのポインタが保存されるため、lex()終了後にそれが残り、 次のlex()の最初のコマンド行にそれが入ってしまう。 [対 応] @当該エリアのポインタは、leaf作成後にNULLにしない。エリアの項目数は、ゼロにする。 A当該エリアは、エリアの項目数がゼロのときに確保する。 B当該エリアを確保する処理は、各行のパラメータを設定する処理の中で呼ぶ。 --> cllex.c clleaf.c 2011.10.28 [不具合] defineのARRAYとMAPPEDARRAY定義で名前にシステム変数名を指定できる。 [原 因] システム変数名かどうかをチェックしていない。 [対 応] チェックルーチンをcl_chk_name()からcl_def_chk_name()に変更する。 --> clprdef.c 2012.07.17 [不具合] 再起関数のローカル変数に値が保存されない。 [原 因] ローカル変数の値をスクリプトのハッシュ域で管理しているが、再起関数のときは、 ハッシュキーが同じになり、値が上書きされている。 [対 応] ローカル変数の値をproc単位の配列で管理する構造体を定義しこれを使って管理する。 --> cl_gx_exp_imd.c clmkproc.c 2013.03.21 [不具合] static Class内の関数内の関数を実行するとき、Class内の関数名を変数に入れて、 それを指定すると変数に入れた関数が未定義のエラーになる。 [原 因] 変数に入れた関数名をサーチするときに、関数名長が変数名長になっているため。 クラス内の関数(メソッド)の定義を取得する処理の最初で、指定変数名へのポインタと 変数名長をローカル変数にセットしており、変数名が指す関数名へのポインタと関数名長にも その変数と同じローカル変数を使用しているが、関数名長をセットしていない。 [対 応] 関数名長をセットする。 --> cl_class.c 2013.03.25 [不具合] 関数中のdecimal定義に変数を指定した文の2回目の実行でcore。 [原 因] 変数部処理でObjが設定されていない。define処理の高速化のために一度実行した部分を オブジェクト化し、2回目以降はオブジェクト化処理をスキップしているが、Objの設定も スキップされている。 [対 応] Obj設定をスキップする前に移動。 --> clprdef.c [不具合] パラメータに、"#*"を指定すると、PRAGMAのエラーとなる。 [原 因] "#"をプリプロセッサ文の始まりと解釈している。 [対 応] lexの処理でコマンドモードのときのみ、"#"をプリプロセッサ文の始まりとする。 --> cllex.c <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<【機能改善】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [改 善] [変 更] 2011.08.03 [改 善] クラス生成に、newを使用可能とした。 [変 更] newを単項演算子とする。(atr=13) newの直後が'('のときは、関数に変更する。 newで指定したクラス名は、8000番代に、その他のクラス名は、7000番代とした。これは、 "new クラス名(...)"のときのクラス名の直後の'('は、OKだが、その他のとき、例えば、 "new(クラス名,...)"のときのクラス名の直後の'('は、エラーとするためである。 2011.08.12 [改 善] プリプロセッサ機能を使用可能とした。 [変 更] #=define, #=undef, #=ifdef, #=ifndef, #=elifdef, #=elifndef, #=if, #elif, #=else #=endif をサポートした。 --> cllex.c clglobal.c coalmain.c 2011.08.24 [改 善] #=include をサポートした。 [変 更] defineStackの初期化、後処理の見直し。 cl_chk_pos()への_resume_define()組み込みとリターン値処理追加。 エラー時のスクリプトファイル名と行数出力の見直し。 コマンドテーブルの終端およびサーチ方法の見直し。 --> cllex.c clglobal.c cltree.c clmessage.c clnode.c clleaf.c cltrbexp.c 2011.08.29 [改 善] TIMES関数を追加した。 [変 更] --> clconst.h clprloop.c cl_gx_func_bexp.c 2011.09.xx [改 善] インスタンス変数のデータとして、変数名を持つようにした。 [変 更] cl_gx_rep_info_set_name()でコピー元がインスタンスのときは、データに変数名を設定する。 --> cl_gx_rep_prm_set.c 2011.09.16 [改 善] エラーメッセージをerrmsg[]に保存する場合に、文字数制限をなくした。 [変 更] errmsg[256]をerrmsg[248]にして、その下に、int err_msg_lenとchar *err_msgを設け、 エラーメッセージを保存する場合は、err_msgをMRealloc()して、後ろに追加するようにした。 --> cllog.c cllocal.h 2011.09.19 [改 善] LIKE(),REGEX(),INSTR(),INLIKE(),REPLIKE()で、サーチ開始位置を指定できるようにした。 [変 更] 対象文字列の次の引数が整数値属性のときは、これをサーチ開始位置と見なす。 --> cl_cmpt_comp.c cl_cmpt_string.c 2011.09.20 [改 善] ドット式で文字列を切り出すことができるようにした。 [変 更] @XXXX.YYYでXXXXが定数か一般データ変数のとき、'.'をドット演算子とした。 AXXXX,YYYにおいて、YYYを整数値(NNN)に変換できるときは、XXXXを文字列に変換して、 NNN文字以降を切り出す。 --> cl_gx_exp_imd.c cl_gx_compile.c cl_cmpt_comp.c 2011.09.26 [改 善] rep(),condas()にもサーチ開始位置を指定できるようにした。 サーチ開始位置の後ろにサーチ長を指定できるようにした。 サーチ開始位置および文字列切り出し指定において、範囲指定またはデータ並びを指定できるようにした。 [変 更] サーチ開始位置の次の引数が整数値属性のときは、これをサーチ長と見なす。 サーチ開始位置が範囲指定のときは、サーチ開始位置と終了位置と見なす。 サーチ開始位置がデータ並びのときは、サーチ開始位置とサーチ長と見なす。 --> cl_cmpt_comp.c cl_cmpt_string.c 2011.10.04 [改 善] DEFINE VAR で、AS以降を省略できるようにした。 [変 更] ASがないときは、属性をバリアント型とした。 --> clprdeftype.c [改 善] DEFINE VAR で、配列を定義できるようにした。 [変 更] 変数名の直後が'['のときは、配列定義用のCmdObjectを生成して配列定義関数を呼ぶ。 --> clprdeftype.c [改 善] DEFINE VAR で、複数変数を定義したときに、初期値設定ができるようにした。(最後の変数のみが対象) [変 更] エラーチェックを外した。配列定義関数ので、配列のpInfoParmを返す処理(ID=7)を追加した。 --> clprdeftype.c cpprdef.c 2011.10.12 [改 善] #*define/#*undefの定義では、keyの大文字小文字を区別しないようにした。 [変 更] keyの大文字小文字を区別しないオプションを設定できるシーケンシャルサーチ用関数を追加。 #*define/#*undefのときは、その関数を使って大文字小文字を区別しないキーを登録するテーブルを 追加。キーを検索するときは、最初にこのテーブルをサーチするようにした。 --> clconst.h cllex.c akxlib.h akxssrch.c akxshash.c akxgetstpl.c makefile 2011.10.19 [改 善] PRINTOUTL()とDEBUGOUTL()を合わせたマクロPRDBGOUTL()を追加した。 [変 更] STDOUTとSTDERRついては、どちらかの出力レベルと出力フラグが出力のときに、 その方にのみ出力する。 FILEについては、両方に出力するになっていて、ファイル名へのパスが同じときは、 片方のみで出力し、どちらか片方のみのときは、それに出力する。 --> akblog.c akbmacro.h coalmain.c clprimport.c clexescr.c clscr.c 2011.10.27 [改 善] 対話モードに入力行の保存、編集機能を追加した。 [変 更] lex()の行入力で、編集ルーチンを呼ぶようにし、その中に、行入力、保存、編集機能を持たせる。 cl_path.c cllex,c clconst.h cllexfnc.c 2011.10.28 [改 善] defineコマンドをdefineなしでも指定できるようにした。 [変 更] defineなしだと、LETコマンドとなるが、手続き外のときは、LETをdefineに変える。 -->cltree.c 2011.11.09 [改 善] データ並び式を代入式の左辺に指定できるようにした。 [変 更] 左辺がデータ並び式のときは、その各要素に右辺の評価結果を代入するようにした。 -->cl_gx_compile.c <<<<<<<<<<【性能改善】>>>>>>>>>> 2011.07.25 [改 善] defineコマンドで、式が現れるヶ所のコンパイル結果を保存し、再利用できるようにした。 [変 更] --> clprdef.c cpprdeftype.c