coal 7.1.0の機能改善およびバグfix ******************************** * 機 能 改 善 * ******************************** <2021.04.19> (1)SPLIT()を追加した。 --> <2021.04.28> (2)ECMD()を追加した。 --> <2021.05.03> (3)配列定義でMAPPEDARRAYも定義できるようにした。 --> <2021.05.05> (4)二項演算のMAX,MIN,TOを関数で実行するようにした。 BEXPコマンドの演算子で、全関数を実行できるようにした。 --> cl_gx_compute.c,cl_cmpt_comp.c <2021.05.06> (5)defineコマンドで、ARRAYとMAPPEDARRAYのどちらも2個指定するとエラーとなるようにした。 --> clprdef.c <2021.05.07> (6)cl_get_array_def_parm()で、配列指定の後に余分な文字があるとSYNTAXエラーとしていたが、 余分な文字があるというエラーにして、その文字が分かるようにした。 また、配列指定の文字列が予約語のときは、その旨のエラーメッセージを出すようにした。 "HASH"が、次元の2つ目以降にあるときは、"HASH"に位置が不正ですのエラーメッセージを出すようにした。 --> clprdeftype.c <2021.05.08> (7)ADD_TO_DATE()を追加した。 --> clconst.h,cl_gx_func_bexp.c,cl_cmpt_date.c <2021.05.09> (8)ARRAYCMP()で、"="も"=="と見なすようにした。 --> cl_gx_rep_set.c (9)_array_cmp()で、演算子エラーを検出するようにした。 --> cl_gx_rep_set.c,cl_cmpt_comp.c <2021.05.10> (10)_get_comp_no()で、opt=0x10のときは、"LIKE"等も演算子とするようにした。 _array_cmp()では、このoptを使用するようにした。 --> cl_gx_rep_set.c,cl_cmpt_comp.c <2021.05.11> (11)CDATEのキャストで日付書式を指定できるようにした。 --> cl_gx_compute.c,clfunc.c <2021.05.17> (12)実行時オプション21でファイルの文字コードを指定できるようにした。 --> cllex.c,cl_cmpt_string.c, <2021.05.20> (13)Interactiveモードで、/d のパラメータに複数の行番号を指定できるようにした。 --> cl_path.c <2021.05.28> (14)IN[STR}演算等とIN[STR}関数等において、配列、リスト、データ並びの中も比較できるようにした. --> cl_cmpt_comp.c,cl_gx_rep_set.c,clfunc.c,cl_gx_compute.c <2021.06.01> (15)範囲指定式で日付データを指定できるようにした。 --> cl_gx_exp_imd.c,cl_user_func.c,cl_gx_compute.c,cl_cmpt_date.c,clmessage.c <2021.06.01> (16)RANGE()関数を追加した。範囲式でも増分を指定できるようにした。 --> cl_gx_exp_imd.c,cl_user_func.c,clfunc.c,cl_gx_exp_compile.c,cllog.c ,cl_gx_rep_prm_set.c <2021.6.7> (17)範囲値展開用のデータ指定演算子'**'を追加した。 --> cl_gx_exp_imd.c,clfunc.c,cl_gx_exp_compile.c <2021.6.9> (18)式の中で'**'指定のデータがあっても正常に演算されるようにした。 --> cl_gx_exp_imd.c,cl_gx_exp_compile.c <2021.6.13> (19)COUNTV()に設定済みの最大要素までの数を返すオプションを追加した。 --> clfunc.c <2021.6.14> (20)mapped配列のindex[2]にpSize[7]を反映させる処理を見直した。 --> cl_array.c,clprdef.c,cl_user_func.c <2021.6.23> (21)XMLのONコマンドで指定したキーワードに対応するタグを処理するようにした。 --> clpron.c,cl_search_ontbl.c (22)FOPEN()のモードに'b'を追加したときは、文字コード変換しないようにした。 --> clfuncfile.c <2021.6.26> (23)FOPEN()でディレクトリをオープンしたときは、エラーとなるようにした。 また、FCLOSE()でディレクトリをクローズしたときは、正常とし、ワーニングを 出すようにした。 --> clfuncfile.c (24)EXEC SCのパラメータで、"local %*"と$*を指定できるようにした。 --> cl_scparmset.c <2021.7.8> (25)EXEC SC,IPのパラメータで、"local %*"と$*を指定できるようにした。 さらに、%n*,#n*,$n*でn番目以降を指定できるようにした。 --> cl_scparmset.c <2021.7.12> (26)IS演算に表示バイト数を求める機能を追加した。LENW()を追加した。 --> cl_cmpt_is.c, cl_gx_func_bexp.c <2021.7.18> (27)プリプロのdefineで同じキーのときは、上書きにした。 --> cllex.c (28)スコープ指定なしの一般変数のときは、obj0を作らないようにし、clear_var_obj()等は 実行しないようにした。 --> cl_compile.c <2021.7.19> (29)「5.8.変数のスコープおよびアドレスの評価」の章を追加し、obj0を作る変数と作らない変数を明確にした。 また、proc開始時に、proc内で参照するLOCAL変数のobj0をクリアする関数を実行するようにした。 --> cl_compile.c, clprproc.c <2021.7.23> (30)cl_set_global_var()をcl_set_prive_var()に変更した。以下の関数を追加した。 cl_set_var() cl_set_global_var() cl_set_global_var_info() cl_set_public_var_info() cl_get_var() cl_get_public_var() --> cl_proc_bexp.c, cl_packet_check.c, cl_proc_leave.c, clpsnd.c, clprloop.c, clprcv.c, cl_cmpt_date.c, colinit.c (31)heredoc()を追加した。 --> clconst.h, cl_gx_func_bexp.c, clfuncfile.c <2021.7.27> (32)MAX(),MIN()で、配列、リスト、データ並びを指定できるようにした。 --> cl_cmpt_comp.c <2021.8.2> (33)「〜へは代入はできません。」のメッセージを変数種別も出力するメッセージに変更した。 idを変数種別の文字に変換する関数(cl_gx_get_name_from_id())を追加した。 --> cl_gx_compile.c(_ex_conv_parm_opt) <2021.8.4> (34)スクリプトから呼び出したスクリプトが終了したときに、終了のメッセージを出力するようにした。 --> clexescr.c (35)ndef(xxxx,,1)のときに、変数またはデータの設定状態を返すようにした。 --> clfunc.c(cl_ex_ndef,cl_is_ndef,_ndef_kind(新規追加)) <2021.8.8> (36)EXEC SC のスクリプトのパラメータに名前付き引数でheredocを指定できるようにした。 stdin,stdout,stderrをスクリプト毎に持たせ、下位のスクリプトに引き継ぐようにした。 --> clfuncfile.c,cl_scparmset.c,cl_gx_compile.c <2021.8.11> (37)名前付き引数式を変数に代入したとき、値に変数を指定したときに、値のInfoParmがコピーされないように、 'S'形式になるようにした。 --> cl_gx_rep_prm_set.c(cl_gx_rep_info_copy_data), cl_gx_compile.c(cl_gx_ex_obj) clprproc.c, cl_user_func.c, cl_scparmset.c <2021.8.14> (38)配列の集合演算'+'で、未定義要素が結果に入らないようにした。 --> cl_gx_rep_prm_set.c(_array_add_sub) <2021.8.21> (39)UNDEFINEコマンドの変数名をLIKE指定できるようにした。 --> clprdef.c, clprundef.c(clprdef.cから分離) <2021.8.22> (40)cl_gx_get_aux1_from_opt()等を共通ルーチンを使うようにした。 --> clglobal.c, cl_gx_compile.c, clprdef.c (41)akxs_iseq()のオプションありの関数akxs_iseq_opt()を追加し、比較方式を指定できるようにした。 --> akxs_iseq(), akxs_iseq_opt() <2021.8.23> (42)memnzcpy(d,s,len,n))のnを終端null文字を含む長さとした。 --> akxlib.c, coalmain.c, cl_gx_rep_prm_set.c, cl_gx_get_index.c, cl_execute_proc.c, cl_conv_parm.c, cl_conv_const_n.c, cl_cmpt_string.c, cl_cmpt_string.c, cl_cmpt_date.c, cl_class.c, cl_anal_parm.c, cltrloop.c, cltrif.c, clprdeftype.c, cllex.c, clprundef.c, clprdef.c, clprexec.c, akxmemtool.c, akxalog.c, akxlib.c <2021.8.25> (43)EXECコマンドの手続き種別にオプション文字列を付加できるようにし、NOTRYを追加した。 --> cllocal.h, cltrbexp.c, clexescr.c <2021.8.26> (44)TRYモードを下位スクリプトに波及させないようにした。 オプション7にTRYモードを下位スクリプトに波及させるオプションを付加した。 EXECコマンドの手続き種別オプション文字列をTRYPASSとNOTRYPASSとした。 --> clexescr.c <2021.8.26> (45)変数定義の配列型指定で配列を定義できるようにした。 --> clprdef.c, clprdeftype.c, cl_gx_rep_set.c, cl_gx_compile.c, cl_user_func.c, <2021.9.7> (46)D_DATA_DATA_FREEを追加し、リストとデータ並びの集合演算時にこれを設定することで、loop eachの 最後で、集合演算時にmallocしたエリアをfreeできるようにした。 ==> 式の中でmallocされ、変数に値が入らないときは、freeされないでメモリーリークとなっている。 --> cl_gx_rep_prm_set.c, clprloop.c <2021.9.8> (47)akxscacheにakxm_malloc_constct()を組み込み、akb_gs_akb_stplix()でこれを使うようにした。 --> akxscache.c, akbname.c ******************************** * Bug fix * ******************************** <2021.05.05> (1)日付データの16進表示で、日付データが出力されない。 [原因]mpa構造体を出力している。 [措置]データ部分(num)を出力するようにした。 --> cl_cmpt_to.c,cl_user_func.c (2)PRINTで、BULKデータが0バイトで表示される。 [原因]オプションxにインターバルを追加した際に、BULKでは、インターバルを出力バイト数としているが、 これが未指定(=0)のときも出力バイト数としている。 [措置]インターバルが未指定(=0)のときは、出力バイト数にしないようにした。 --> cl_user_func.c <2021.05.06> (3)配列のエラーメッセージに、"cast("は、出力される。 [原因]演算子コード6の名称が、"cast("になっていた。 [措置]演算子コード6の名称を"array["に修正した。"cast("は、10に設定した。 --> clprdeftype.c <2021.05.07> (4)defineコマンドのデータ型指定の後ろにデータ型以外があると属性指定なしのエラー。 [原因]cl_get_def_attr_SSP_opt()で、データ型指定の後ろにデータ型指定がないかを チェックしているが、このとき、データ型指定がないときエラーとなるopt(0x80)が たっている。 [措置]optを0とした。 --> clprdeftype.c <2021.05.08> (5)TO_DATE()で、日付文字列('1234')と書式文字列('10')の書式以外の箇所が一致しなくてもエラーにならない。 このとき、'2001/01/01 00:00:00'が返される。 [原因]各桁の文字比較時に、書式文字列の残り長を比較の前に-1しているため、 書式文字列最後まで一致したことになっている。 このとき、書式がなかった時間間隔以降は、初期値を設定することになっており、 年以降がないときは、現在日付の下2桁を'01'としている。 [措置]-1する位置を比較の後にした。年以降の時間間隔がないときは、年の'1970'を設定する。 --> cl_cmpt_comp.c (6)BEXPコマンドで、演算子にABSを指定すると第2項の絶対値を返す。 [原因]2項演算(cl_gx_bexp())において、単項演算のときは、対象を第2項(pInfoParm2)に入れこれを使うことにしている。 [措置]ABSのときは、pInfoParm2 = pInfoParm1 とした。(通常の式では、ABSは関数扱いのため、cl_gx_bexp()にこない) --> cl_gx_compute.c <2021.05.09> (7)BEXPコマンドで、INLIKEの戻り値が文字になる。 [原因]関数区分がSTRINGのため、文字列演算となり戻り値が文字になっている。 [措置]関数区分をFUNCTIONにした。 --> cl_gx_func_bexp.c (8)一般番号配列のARRAYCMP()で一般番号配列の設定済みインデックスが0である。 [原因]_get_array_info_used_ref()で番号配列の設定済み要素のを最大位置を設定しているが、 iParm[1]に設定している。 [措置]iParm[3]に設定するようにした。 --> cl_gx_rep_set.c (9)一般番号配列のARRAYCLR()でcoreダンプ。 [原因]cl_get_array_index()でIndex情報へのポインタを取得しているが、番号配列はNULLを返す。 [措置]cl_get_array_index()を止め、_get_array_info_used()で取得したものを使う。 --> cl_gx_rep_set.c (10)cl_cmpt_comp_opt()で、id1かid2がnullのとき、演算子を番号を取得していない。 [原因]_get_comp_no()の呼び忘れ。 [措置]_get_comp_no()のエラーメッセージ出力有無オプションを復活させ、 エラーメッセージ出力ありで呼ぶようにした。 --> cl_cmpt_comp.c (11)GET_VAL()で、'OPTION'以外を指定するとcoreダンプ。 [原因]エラーメッセージ出力時に関数名を変数(_fn_)で指定しているが、*_fn_となっている。 [措置]*を取る。 --> clfunc.c (12)以下で、全角文字が化ける。   ・コマンドパラメータ   ・コマンドパラメータでの"{}"の中   ・Interactiveモードでの入出力、HELP出力、tree出力   ・スクリプトファイル中のdirect指定 [原因]・コマンドパラメータ       コマンドパラメータの文字コードをCoal内部文字コードにしている。      ・コマンドパラメータでの"{}"の中、Interactiveモードでの入出力、HELP出力       文字コードが変換されていない。      ・スクリプトファイル中のdirect指定       文字コードがUTF-8に変換済みにも関わらず、lex()でS-JIS-->UTF-8変換されている。 [措置]・コマンドパラメータ       コマンドパラメータの文字コードをLANGに合わせた。      ・コマンドパラメータでの"{}"の中、Interactiveモードでの入出力、HELP出力       入出力時に文字コードを変換するようにした。      ・スクリプトファイル中のdirect指定       オプション中にスクリプトの文字コードとそれを使用するフラグを追加し、      lex()では、それをチェックするようにした。       スクリプトファイル中のdirect指定時、コマンドパラメータでの"{}"指定時、      Interactiveモード時には、このフラグを立て、オプションには、Coal内部文字コード      または、実行時オプション21のスクリプト標準入力文字コードを設定するようにした。 --> alxlib.h,akxcode.c,akxalog.c,clmain.c,cllex.c,cl_path.c,cl_cmpt_string.c,cl_get_script_name.c cl_execute_proc.c <2021.05.21> (13)Interactiveモードで、/l tで何も表示されない。 [原因]1回のスクリプト実行後に、次の入力待ちになる前にTreeをFreeしている。 [措置]次の入力待ちになる前にTreeを退避ポインタに移す。Freeはしない。 次のコマンド入力後に、退避したTreeをFreeする。 --> cl_path.c <2021.05.23> (14)ecmd()で、全角文字が化ける。 [原因]スクリプトファイル中のdirect指定と同じ。 [措置]スクリプトファイル中のdirect指定と同じ。 --> clfunc.c <2021.05.24> (15)変数定義で、カンマの後の配列名が「〜がありません」のエラーになる。 [原因]cl_chk_name()でエラーでないとき、このエラーにしている。 [措置]この部分の#if 1を0にする。 --> clprdeftype.c (16)変数定義で、変数部分がカンマで終わっていてもエラーにならない。 [原因]カンマの出現をチェックしているが、カンマで終わっても何もしていない。 [措置]カンマで終わっていたらエラーにする。 --> clprdeftype.c <2021.05.27> (17)配列名を配列要素に代入し、その配列要素を配列名とする要素を参照すると、 配列名がないか不正ですのエラーになる。 [原因]配列要素(XXX[nn]の形)が一つ前のときは、']'の4ではなく2998を一つ前のattrと しているが、'['の一つ前が何かを判定しているところで、2998を見ていない。 [措置]2998を見るようにした。 --> cl_gx_compile.c <2021.05.29> (18)INで"ABC"の半角全角を問わないオプションが効かない。 [原因]akxmbncmp_type_opt()中のakxctozen1_type_opt()で全角変換するときに、 akxmbncmp_type_opt()のoptをそのまま指定している。opt=0x12となっており、 A-Zを変換しないオプションになっていた。 akxctozen1_type_opt()で、if (from_type < 0)となっていた。 [措置]akxctozen1_type_opt()のoptを0にした。if (from_type <= 0)とした。 akxmbncmp_type_opt()で、type<=0のときに、typeを取得するようにした。 --> akxlib.c,akxcode.c <2021.05.31> (19)iif((CBIN)%1,'T','F')で、オプティマイズエラーになる。 [原因](CBIN)のCBINは、CAST関数となるが、関数呼び出しではない(後に5がない)にも関わらず、 オプティマイズ時には、関数として処理している。 [措置]'F'の次に'('が来ないときは、そのまま次を読むようにした。 --> cl_gx_compile.c (20)固定長DECIMAL(DEC(5,2)等)のゼロがゼロ判定されない。 [原因]0.00等になるように、zeroフラグを0にしている。   [措置]0.00等になるように設定後、zeroフラグを1にした。さらに、zeroフラグが1のときには、 何もしないでリターンしているところは、lenも0という条件を追加した。 --> akxmpa.c <2021.06.01> (21)logの日付データの出力で、マイクロ秒以降が正しく出力されない。 [原因日付データをm_mpa2an()で変換している。   [措置]cl_date2str("[YYYY-MM-DD HH:MI:SS.U P DY DDD]")で変換するようにした。 また、num[]の出力は、日付データの形式に合わせるようにした。 --> cllog.c (22)TO_DATE()のU変換で、値がUの桁数より大きいときでもUの桁数で出力される。 [原因]%06dで変換し、Uの桁数で出力している。   [措置]値がUの桁数より大きいときは、値の桁数で出力するようにした。 --> cl_cmpt_date.c <2021.06.13> (23)mappedarrayでマップ位置が2以上のときCOUNTV()の値がマップ位置1と同じ。 [原因]cl_get_array_index_tbl_ref()の中で、mappedarrayのときは、map 元の pSize[7]が自分のindex[2]より大きかったらindex[2]に設定しているが、 反映する値にマップ位置が考慮されていない。   [措置]反映する値にマップ位置を考慮するようにした。 --> cl_array.c (23)printで配列情報をdumpしたとき、上記pSize[7]が反映されていない。 [原因]mapped配列に値を設定した後にindex[2]に反映されるのは、cl_get_array_index_tbl_ref()を 呼び出して配列のindex情報を取得したときだが、printでは、pInfoParm->pi_dataを 直接indexをして使用している。   [措置]cl_get_array_index_tbl()を呼び出してindex情報を取得するようにした。 --> cl_user_func.c (24)Index情報を取得したいpInfoParmのpInfoParm->pi_dataをpIndexに指定して、 cl_get_array_index_tbl_ref(),cl_get_array_info_ref()を呼び出すと、 Index情報がゼロクリアされる。 [原因]処理の最初でpIndexの内容をゼロクリアしている。   [措置]pInfoParm->pi_dataとpIndexが同じときは、ゼロクリアしないようにした。 (25)forループが終了しない [原因]**演算を追加した際に代入処理を修正し、更新されたirsのda1を再設定するようにしたが、 このときに、irsがリターンコードに設定されたままになった。 obj実行中にリターンコードが正のときに処理が終了するが、エラーとならないため、 スクリプトの処理が継続する。   [措置]irsの処理後リターンコードをゼロにした。また、リターンコードが正のときは、 ワーニングメッセージを出力してobj実行が継続するようにした。 --> cl_gx_compile.c <2021.6.26> (26)IF THENL時にTreeに挿入されるENDIFノードの表示がLETになっている。 [原因]ENDIFノードを挿入するときに、コマンド名が入る変数(comstr)に設定していなかったため、 1つ前のコマンドが表示されていた。   [措置]comstrにENDIFを設定した。 --> cllext.c (27)TRYのFINALLYブロック内のIFブロック中でエラーが起きるとENDTRYが実行されず、エラーコードが0にならない。 [原因]上記エラーが起きると、処理がTRYブロックに移り、カレントのブロックがTRYブロックになる。 ここで、次にENDIFが実行されるが、ENDIF処理では、正常時は、カレントブロックを 自IFブロックの1つ前のブロックに変更する。 上記エラー時には、ENDIFが実行されるときには、カレントブロックがTRYブロックに変更されているため、 カレントブロックを変更する処理は不要にも関わらず、1つ前のブロックに変更している。 TRYブロックの1つ前のブロックが存在していないため、ENDTRYでは、処理の開始で、-1でリターンしていた。   [措置]ENDIF処理(ENDTRY,ENDSWも同じルーチン)では、ブロックのIDとコマンドが対応するときのみ、 カレントブロックを自ブロックの1つ前のブロックに変更するようにした。 --> cl_process_end_if.c <2021.6.27> (28)SWITCHのCASE実行後breakせずに次のDEFAULTを実行し、その中でBREAKするとシステムエラーになる。 [原因]ブロック内の各ブロックを実行するときは、次のブロックのleafをreturnスタックにpushすると共に、 カレントブロック制御構造体にもこのleafを登録しておき、popで次のノードを実行するときのキーとしている。 上記で、DEFAULTを実行するときに、カレントブロック制御構造体にleafを登録する処理が抜けていた。   [措置]カレントブロック制御構造体にleafを登録する処理を追加した。 <2021.6.30> (29)クラス生成でメソッド('M')を返すと、そのメソッドをdumpするとメソッド名の後ろにゴミが表示される。 [原因]上記のメソッドを変数に代入する際に、データをコピーする処理で、通常の文字データと関数('F')しか、 NULL終端を設定していない。 [措置]クラス('C'),インスタンス('I'),メソッド('M'),オブジェクト('O')もNULL終端を設定するようにした。 --> cl_gx_rep_prm_set.c (30)ARRAYCLR()で、個数省略で内部番号配列を指定すると設定済み最大要素が65531になる。 [原因]設定済み最大要素としてiParm[1](定義サイズ)を使用していた。 [措置]設定値が省略またはNULLパラメータのときは、iParm[3]を使うようにした。 --> cl_gx_rep_set.c (31)ARRAYCLR()で、内部番号配列とバリアント型配列でクリア値を省略しても設定済み最大要素が変わらない。 [原因]内部番号配列のatrにpIndex->uAttr[0]を使っていた。 Index情報の取得で、実体のIndexを取得していなかった。 [措置]内部番号配列のatrには、バリアント型を設定するようにした。 _get_array_info_used_ref()を使うようにした。また、設定済み最大要素に開始位置-1を設定するようにした。 --> cl_gx_rep_set.c <2021.7.1> (32)スクリプトからスクリプトを実行すると、その度にdefineコマンドの全てが再実行される。 [原因]上記のとき、そのようになっている。 [措置]define/dimを実行したらleafにD_LEAF_DEF_EXECUTEDのフラグを立てて再実行しないようにした。 --> clprdef.c,clconst.h <2021.7.11> (33)Coal_mini環境で、同じ手続きを呼ぶとき、3回目で落ちる。 [原因]手続き開始時、argc変数定義時に、手続き内の同名変数の設定済み値を未設定状態にするところで、 未アロケートのobj0を参照している。 手続き内のコマンド実行時にobj0の使用数を記憶しておき、次回の手続き開始時にその分のエリアを確保している。 ここで、2回目の手続き実行時には、最初の使用obj0数を除き使用obj0数が記憶されておらず、3回目の開始時には 必要な数のobj0エリアが確保されておらず、落ちていた。 Coal_mini環境以外では、手続き開始時に前回使用数+デフォルト使用数分のエリアを確保している。 [措置]2回目の手続き実行時に、最初の使用obj0数以降の使用obj0数も記憶されるようにし、Coal_mini環境以外では、 デフォルト使用数分を加えないようにした。 --> clmkproc.c(cl_mk_obj0), cl_gx_exp_imd.c(tdtObjHead) <2021.7.11> (34)GETVAL('OPTION',i)で、i=21で範囲外のエラーとなる。 [原因]範囲の上限を20としていた。 [措置]define値MAX_OPTIONSを使いようにした。合わせて、配列定義にもMAX_OPTIONSを使うようにした。 --> clfunc.c, clglobal.c, colinit.c <2021.7.13> (35)exec_all_test2.clを使って、test_import.cl,test_import2.cl test.cl,test_import3.clを実行すると、 test.cl,test_import3.clのconv()実行で、ei_to_s[]が有効でないのエラーになる。 [原因]まず、スコープ毎に異なるgidを付与し、セッション管理テーブルに登録しておく、配列変数には 配列変数のスコープに対応するスコープのgidを設定する。配列変数に設定されたgidが登録されていれば有効とする。 配列変数のスコープに対応するスコープのgidを求める処理で、LOCALとPRIVATE(その他は、procとscrctで決まる) しか判定していないため、procかscriptが終了した時点で、gidが無効になる。 ei_to_s[]は、test_import.clでGLOBALに定義されていたが、test_import.clの終了でgidが無効になっていた。 [措置]配列変数のスコープに対応するスコープのgidを求める処理で、PUBLICとGLOBALも判定するようにした。 GLOBAL変数のgidは、セッション管理テーブルでは管理できないため、GLOBAL管理テーブルに管理するようにした。 PUBLICとGLOBALのgidをそれぞれセッション管理テーブルとGLOBAL管理テーブルに設定するようにした --> cllocal.h, clprdef.c, colinit.c, clmkproc.c, clmkscpt.c, cl_packet_check.c, clprloop.c, clprdeftype.c, cllog.c, cl_gx_compile.c, clterm.c, clclear.c, clerscpt.c, clerproc.c (36)FLOAT型の範囲値を要素とするリストをfor eachでprintとすると、no mallocが出る。 [原因]FLOAT型の範囲値は、Malloc()で値が設定されいる。cl_get_range_info()で開始値と終了値を取得する際に、 元のInfoParmをcl_gx_copy_info()でコピーしていたために、D_DATA_MALLOCフラグが残っていた。 pi_dataは、_print_info_data()の中で、tmp領域が設定されている。 1加算する処理で_gx_ppmm()を使っているが、その中では元のpInfoParm->pi_dataを使わないように設定し直すために、 pInfoParmのD_DATA_MALLOCフラグが立っていたらFree()していた。 [措置]cl_get_range_info()で開始値と終了値を取得する際に、元のInfoParmをcl_gx_copy_info()でコピーした後で、 開始値と終了値のD_DATA_MALLOCフラグをOFFにする。 --> clfunc.c(cl_get_range_info) (37)スクリプトから同じスクリプトを実行すると、2度目でdefineコマンドが実行されない。 [原因]bug(32)で修正で、2度目のdefineコマンドが実行されないようになっていた。 bug(32)は、importされたdefineコマンドは、スクリプトが実行される毎に実行されていたの原因だった。 スクリプト実行でimportされたdefineコマンドのみを実行する仕組みになっていないため、import用の treeの先頭からサーチしてdefineコマンドを実行している。 [措置]import用treeのdefineコマンドを実行したときのみ、実行済みのフラグを立てるようにした。 --> clprdef.c <2021.7.16> (38)test_narusist.clを実行すると、途中で、「"["が見つからない」のエラーになる。 [原因]bug(33)の修正の結果、procが開始するときにused=0から始まるようになった。 同じprocの何度目かの実行で、今まで実行されていない変数を含む文が実行され、その時点でのusedの下のobj0が使われた。 この場所は、当該の文が実行されていないときの次の文が使っていたobj0だったため、本来のobj0が異なる変数で上書きされ、 結果このエラーとなった。 [措置]procが開始するときにはusedが前回のまま始まるようにした。 また、Obj->alszを増やすときは、MAX_CMD_OBJ0の倍数になるようにした。 --> clmkproc.c(cl_mk_obj0), cl_gx_exp_imd.c(_add_obj0,_check_add_obj0) (39)option 1 2 で、配列でない変数が未定義エラーになる。 [原因]scope指定なしの変数取得(conv_parm)で、option 1 2 の判定がない。 [措置]option 1 が(2 && !0x10)のときは、無条件で、変数を作成するようにした。 --> cl_conv_parm.c(cl_gx_get_all_var_ent_psize) (40)range(1,10,2)の終端値が途中で、壊れる。 [原因]範囲値エリアのサイズを求める処理を以下にしていたため、1個分した確保できていなかった。 alen = 0; switch (atr1) { case DEF_ZOK_FLOT: case DEF_ZOK_DECI: alen = len + len; <-- (1) case DEF_ZOK_BINA: alen += len; <-- (2) [措置](1)と(2)を入れ替えた。 --> clfunc.c(cl_func_range) (41)round(234.563, 3, 2)(切上げで小数点以下3桁に丸める)で、234.564になる。 [原因]切り上げする桁より下の桁に0以上があるか調べる位置が先頭から6桁目、桁数が1になっている。 [措置]調べる位置を+1した(調べる桁数は計算式で-1される)。 --> akxmpa.c(m_scale) <2021.7.17> (42)exec_all_test2の実行中、test_sleetで落ちる。 [原因]akxs_xseqs_free()でakxs_hasx_free()を呼び、その先のakxm_cct_free()に tdtCONSTCTでないポインタを渡している。 akxs_seqsでは、個々にのキーエリアの確保にtdtCONSTCTを使用していない。 [措置]akxs_hasx_free()ではなく、akxs_seqs_free()を呼ぶようにした。 なお、akxs_seqs_free()では、個々のキーエリアを開放してい」なかったので開放するようにした。 また、将来、tdtCONSTCTを使えるように、個々のキーエリアの開始インデックスを1からにした。 --> akxssrch.c <2021.7.18> (43)i_conv()を使わないオプションで漢字をUTF-8からS-JISに変換し,もう一度、UTF-8からS-JISに 変換しても変換エラーが出ない。 [原因]UTF-8のバイト長を求める処理で、コードが範囲外のときは、1バイトとしていた。 [措置]UTF-8のバイト長を求める処理で、コードが範囲外のときは、エラーを返すようにした。 このとき、1バイト目の判定が0xe2未満のときは、範囲内としていたが、0x80〜0xe1をエラーとした。 さらに、エラーを返す関数をe付きの名前にし、エラーを返さない関数は、それらを呼ぶ形にした。 --> akxcode.c (44)配列aを変数xに代入した後で、配列aをundefし、xをprintすると「配列[a]は無効です。」の エラーにならない。 [原因]元の配列aのInfoへのポインタをaのpi_pauxに設定しているが、xにコピーされるときに NULLになっていて、aが無効化どうかを判定できないため。 [措置]xにコピーする際に、配列のときは、pi_pauxをNULLにしないようにした。 <2021.7.19> (45)felwrite(fp,123456789012345.1234567890123456)で出力し、felread1($fp,CLDECI,30,15)で入力すると、 0.123456789012345になる。 [原因]_func_felwrite()の中で_felwrite1()を呼ぶときにpre=0,sca=0としている。 DECIMALのscaleの未設定値は、以前の修正で、MIN_DEC_SCALE-1 に変更していたときの修正漏れ。 [措置]DECIMALのときは、sca=MIN_DEC_SCALE-1とした。 --> clfuncfile.c <2021.7.20> (46)for eachで、対象データに範囲式を2つ指定し、x.indexとx.valueをprintすると、ループの2回目で、 x.xalueが未定義エラーになる。 [原因]対象データに、式を2つ以上指定すると、PARMINFO2形式となるが、PARMINFO2形式かどうかの判定が、 範囲式かどうかの判定の後ろにある。 [措置]PARMINFO2形式かどうかの判定を最初に移動した。 --> clprloop.c <2021.7.22> (47)tryの中で、inputXMLの実行中にエラーがあってもエラー終了しない。 [原因]エラーがあったONのprocの終了後に、exceptionの判定がない。 [措置]上記で、try中にexceptionがあったときは、現在のprocを消す。 --> clexescr.c(cl_execute_script) (48)printfコマンドの実行で、ObjがNULL [原因]cl_gx_parm_conv_arg()を使って、パラメータを変換しているが、この関数の引数にObjがない。 [措置]Objを追加した。 --> cl_gx_compute.c, cl_user_func.c, cl_gx_func_bexp.c, cl_cmpt_comp.c (49)ObjがNULLで、leafのobj0を使うケースのとき、obj0がクリアされない。 [原因]変数のdaが、$,%,#,<で始まるときのみ、クリア対象にしている。 [措置]上記条件を削除し、id='S'でCONSTでなく、LOCALの変数をクリアするようにした。 ObjがNULLでないときは、proc開始時にObj内のobj0がクリアされているので、 proc開始時に、proc内で参照するLOCAL変数のobj0をクリアする関数を実行するのを止めた。 --> cl_gx_compile.c, clprproc.c(_proc_clear_var) <2021.7.24> (50)$(2)=1;で、設定済み最大インデックスが2にならない。 [原因]設定済み最大インデックスを更新する処理が入っていない。 [措置]cl_conv_parm_opt()と同様に、psizeを設定する。 --> clfunc.c(cl_func_conv_parm) (51)スクリプト内でスクリプトを実行するとき、パラメータに"$0*"を指定すると、エラーメッセージを 出力後、落ちる。 [原因]上記エラー時に、一時的に変更していたpScCT->Varyを戻さずにリターンしていたため、 (呼び出し元スクリプトのVaryを呼び出されるスクリプトのpScCT->Varyに設定) 呼び出されるスクリプトのpScCT->Varyを開放する際に、呼び出し元スクリプトのVaryを開放してしまい、 呼び出し元スクリプトのVaryを開放するときに、開放済みエリア内に設定されているアドレスに アクセスして落ちた。 [措置]pScCT->Varyを戻してからリターンするようにした。同様のヶ所があったので、そこも直した。 --> cl_scparmset.c(cl_scparmset) <2021.7.27> (52)6.3.7を配列の初期値に指定すると落ちる。 [原因]6.3.7は、6.3の7文字目以降を切り出す指定となり、null文字が設定されるが、 null文字設定で、""を使用し、このエリアに'\0'を設定するところで落ちている。 リテラルエリアに書き込むとsegmentationエラーになるようだ。 [措置]static char null_str[2];で、""用のエリアを作成し、これを設定するようにした。 --> cl_cmpt_comp.c(_get_str_pos) <2021.7.29> (53)2回同じスクリプトを実行すると、private変数の1回目の値が残る。 [原因]スクリプト開始時に、private変数のobj0をクリアしていない。 [措置]mainを実行するときは、private変数もobj0をクリアするようにし、proc開始時に、 proc内で参照する変数のobj0をクリアする関数を呼ぶようにした。 --> clprproc.c(_proc_clear_var) <2021.8.2> (54)cl_getenvf()の中のPRINTOUT()で出力されない。 [原因]この時点では、debug_optがakb.iniの設定値のため(level=0)。 [措置]cl_getenvf()内では出力せず、出力データの編集結果をini_mcatに保存し、lineオプションを 取り込んだ後で出力するようにした。 --> coalmain.c(cl_getenvf,cl_getenvf_print(新規追加)) (55)スクリプトからスクリプトを実行し、その中でleaveコマンドを実行すると、 スクリプト全体が終了する。 [原因]coal_dev1版の仕様 [措置]coal_dev1版以外では、leaveコマンドでleave用にフラグを設定するのを止めた。 また、2度目の実行では、パラメータの設定のみを行いリターンするようにした。 --> cl_proc_leave.c <2021.8.4> (56)log(10.0)が負になる。 [原因]10.0と1.0/10.0のときは、定数値を返しており、無条件に負にしている。 [措置]mpa->extが負のときのみ、値を負にするようにした。同様に10.0と1.0/10.0の階乗が2以上 のときは、負にする処理が入っていなかったので、追加した。 --> akxmpa.c (57)ndef(xxx,,1)で、データ未設定のとき、未定儀になる。 [原因]ECL_NDEFVAR_ERRORを返している。 [措置]ECL_NO_DATA_ERRORを返すようにした。 --> cl_gx_compile.c(_ex_conv_parm_opt) (58)redefine mappedarray ma ... で、「 変数名[ma]はARRAYではありません。」のエラー。 [原因]配列定義の種別を'R'に固定している。 mappedarrayもcl_pr_ex_def_array()で処理できるようにしたときの修正漏れ。 [措置]mappedarrayのときは、'A'とした。 --> clprdef.c(cl_pr_ex_def_array) (59)redefine mappedarray ma ... を2回実行すると、「 変数名[ma]はARRAYではありません。」のエラー。 [原因]mappedarrayであることを示すiMAPPEDをcl_pr_ex_def_array_engine()の引数のoptで設定している。 [措置]保存されているobj[]から復元したoptでiMAPPEDを設定するようにした。 --> clprdef.ccl_pr_ex_def_array_engine (60)skip_opt('XXXX',123)が、エラーメッセージなしでエラーになる。 [原因]第3引数に検索文字列があるものとして、第3引数を文字列で取得しに行ってエラーになっている。 [措置]引数の数をチェックして、エラーメッセージを出すようにした。 --> cl_cmpt_comp.c(cl_func_comp) (61)2項演算のLIKE,iLIKE,INSTR,INiSTR,INrSTR,INirSTR,REGEX,iREGEX,SKIP_OPTで、第1項または第2項に 文字列以外を指定すると正しい結果を返さない。 [原因]第1項と第2項が文字列であることを前提にしている。 [措置]第1項と第2項が文字列でないときは、文字列に変換するようにした。 --> cl_cmpt_comp.c(cl_cmpt_comp_opt) (62)to_char(SYSDATE,'"sysdate"=yyyy.mm.dd hh:mi:ss.uuuuuu ddd')で落ちることがある。 [原因]_date2str()で、マイクロ秒の桁数が指定桁数未満のとき、memzcpy()で指定の桁数にしているが、 バイト数の引数がない。 [措置]バイト数の引数を追加した。 --> cl_cmpt_date.c(_date2str) (63)配列名を変数にコピーした後でコピー元をundefし変数を参照すると、「配列(xxxxx)が無効です。」の エラーがでるが、xxxxxxにコピー元の名前でない文字列が表示される。 [原因]undefでコピー元の配列がFreeされており、変数(配列)のpi_posにコピーされたコピー元のpi_posも Freeされており、そのエリアが再利用されている。 [措置]変数(配列)のpi_posには、Strdup()で配列名をコピーした。 --> cl_gx_rep_prm_set.c(cl_gx_rep_info_copy_data) <2021.8.7> (64)名前付き引数式を変数に代入すると、値のInfoParmの内容が不正になる。 [原因]名前付き引数式を変数に代入する際に、値のInfoParmの内容を新しいエリアにコピーしていない。 [措置]値のInfoParmの内容を新しいエリアにコピーするようにした。 値に変数を指定したときに、値のInfoParmがコピーされないように、'S'形式になるようにした。 --> cl_gx_rep_prm_set.c(cl_gx_rep_info_copy_data), cl_gx_compile.c(cl_gx_ex_obj) <2021.8.14> (65)配列の集合演算で、Indexと名前がFreeされない。 [原因]Mallocしており、変数に入らないため。 [措置]Indexはcl_tmp_const_malloc()に変更、名前はセットしない。 --> cl_gx_rep_prm_set.c(cl_gx_array_add,cl_gx_array_minus) (66)配列の集合演算'-'で、左辺から左辺が取り除かれたままの結果になる。 [原因]取り除かれた要素も未定義で結果に入れている。 [措置]未定義またはnullパラメータ要素は演算から除外するようにした。 --> cl_gx_rep_prm_set.c(_array_minus_sub) <2021.8.16> (67)スクリプトのキャッシュ再利用時に同じエントリが使われる。 [原因]キャッシュした時刻の古い順に再利用するようにして入るが、時刻取得にtime(0)を 使っているために同じ時刻になっている。 [措置]時刻保存ようにtimeval構造体を使用するようにした。 --> cllocal.h, clexescr.c (68)importしたスクリプトのproc/funcを実行するときは、それ用のConstCT等を使うようし、 リターンしたら元に戻すようにしているが、元に戻っていない。 [原因]ConstCT等を保存しておらず、元に戻す処理ではimportしたスクリプト用のConstCT等を 戻している。 [措置]importしたスクリプトのproc/funcを実行するときは、リターンしたときに戻すConstCT等を 保存し、importしたスクリプト用のConstCT等を使うようにした。 --> cl_execute_proc.c, clprimport.c (69)スクリプトからスクリプトを呼び出す処理を20回以上実行すると、scparmset()で落ちる。 [原因]スクリプトからスクリプトを呼び出すときのパラメータの変換結果オブジェクトを作成する エリアに呼び出される方のscrct->LeafConstCtを使っていた。 このエリアはスクリプト終了時にFreeされ次回実行時にパラメータの変換結果オブジェクトで このFreeされたエリアを参照していた。 [措置]呼び出されたスクリプトのscrctをリンクする前にパラメータの変換を行い、従来のscparmset() では、この変換されたInfoParmを自スクリプトのパラメータ変数に設定するようにした。 --> clexescr.c, cl_scparmset.c <2021.8.23> (70)D_AUX1_PROTECTEDがONの変数への代入で、「ポインタ(xxxxx)への代入はできません。」になる。 [原因]id=='S'でD_AUX1_PROTECTEDがONのときエラーにしているが、変数の種別判定にこのidを使っている。 [措置]pi_posから変数のpInfoParmを取得し、このidを使う。id==' 'のときは、変数の種別を定数とする。 --> cl_gx_compile.c <2021.8.31> (71)INT_MIN,LONG_MINをputline()で出力すると、"-("が出力される。 [原因]akxcltoa()で整数値を文字列に変換しているが、負の時には、value = -value で正にしてから 文字列に変換している。INT_MIN,LONG_MINのときは、-valueでオーバフローしていた。 [措置]INT_MIN,LONG_MINのときは、value+1, adjust=1とし、最初の文字変換のときに、adjustを加える。 --> akxconvn.c (72)UNIX形式のset_date_part()が、正しく設定されない。 [原因]strptime()を使って、設定しているが、これを呼ぶ前に、tm構造体に現在の日時を設定していない。 [措置]tm構造体に現在の日時を設定するようにした。 --> cl_cmpt_date.c <2021.9.2> (73)coal_mini環境で、test_sysvar2.clを実行すると、途中で関数がないエラーになる。 [原因]Obj->Obj0を拡張するときに、InfoParmの領域も拡張するが、この先頭アドレスは、Obj->Obj0[0]に 入っている。これがNULLになっていたために、拡張ではなく新規取得になった。このとき、拡張分の エリアは、クリアするが、既存部分はクリアしないため不正な値がobj0として使われ、結果、関数 なしのエラーとなった。 Obj->Obj0[0]がNULLになっていたのは、以下の理由による。 (1)式を実行するときに、_re_set_obj0()が実行される。 (2)obj0に値が設定されているときは、この内容をObj->Obj0[0]が指すエリアの所定の位置にコピーし、 式の実行には、コピーされたエリアを使うようになっている。 obj0がNULLのとき(対象項目がobj0を使わないとき)は、上記エリアをNULLにしている。 (3)最初の式の最初の項目が、obj0を使わない変数であったために、Obj->Obj0[0]がNULLになった。 [措置]obj0がNULLのときは、上記エリアをNULLにしないようにした。 --> cl_gx_exp_imd.c(_re_set_obj0) <2021.9.3> (73)coal_mini環境で、test_agg.clを実行すると、「[char]が誤っています。」のエラーになるが、charの後ろに ゴミが入る。 [原因]u8からsjisへの変換で、akxc_utf8_to_sj()が呼ばれる。この中でakxshaslr()の結果を受け取るには、 ha->ha_keyにargv[2]へのポインタを設定しておかなければならないが、設定がなく、逆にha->ha_keyに argv[2]へのポインタが設定されて返されるというコーディングになっていた。 akxshaslr()の中で、値を返すときに、argvが設定されているものとして、argv[1]に値を設定し、この このアドレスがたまたま、cherの後ろを指していてゴミが入った。 [措置]正しい受け取り方に変更した。 --> akxcode.c(akxc_utf8_to_sj) <2021.9.6> (74)64ビット環境で、test_LG.clを実行するとFree()で落ちる。 [原因]配列定義でintを指定すると、要素のsizeが4バイトになり、要素用のエリアその分しか確保していない。 初期値を設定する処理で、このsizeを見ずにlongで設定しており、最後の要素で確保したエリアをオーバー して書き込んだためにmallocの管理情報を壊しFree()で落ちていた. [措置]sizeをチェックして書き込むようにした。 --> cl_gx_rep_prm_set.c(_gx_rep_val_set), cl_gx_compute.c(_gx_ppmm_val) (75)test_agg2.clを実行すると落ちる。 [原因]loop eachの対象が配列の集合演算のとき、Indexをtmp領域に確保している。このため、次行の処理が 開始するときにFree()され、loop内の処理でこの領域が使われ、Index情報が不正になり落ちていた。 tmp領域に確保しているのは、不具合(65)のため。 [措置]D_DATA_INDEX_TMPを追加し、上記では、これを設定することで、loop eachの初期設定で、 Indexをmallocしたエリアに移すようにした。 --> cl_gx_rep_prm_set.c, clprloop.c