coal 7.2.1の機能改善およびバグfix ******************************** * 機 能 改 善 * ******************************** <2022.01.11> (1)「関数の戻り値が未設定のとき、NULL値とする」オプションを追加した。 --> cl_gx_compile.c(cl_gx_ex_obj_sub) <2022.01.12> (2)「代入される変数が未定義のとき、エラーとする」オプションを実装した。 --> cl_gx_compile.c(_conv_arg_opt) <2022.01.17> (3)プリプロセッサ文を全角文字で書けるようにした。 --> cllex.c <2022.01.20> (4)'\n'と'\t'以外の非表示文字を<コードの10進数>で出力するオプションを追加した。 --> clfuncfile.c, cl_user_func.c <2022.02.07> (5)数値定数変換でオーバーフローさせないことをデフォルトとした。オーバーフロー処理を見直した。 --> akxconvn.c, cl_conv_const_n.c (6)数値演算でNULLパラメータ、NONEパラメータは、変換せず0とした。 --> cl_cmpt_math.c <2022.02.12> (7)オプション17の0x02で「=0:Lなしはint、Lありはlongとする。=1:longとする。」とした。 --> cl_conv_const_n.c (8)printでLまたはU付き数字列で、「数字列=」を出力するようにした。 --> cl_user_func.c <2022.02.23> (9)整数演算でオーバーフローをチェックしないオプションを追加した。 --> cl_cmpt_math.c <2022.03.04> (10)TRYモードでないとき、"end of file"エラーメッセージを出力する/しないのオプションを追加した。 --> clfuncfile.c <2022.03.05> (11)EXECのリダイレクトに式を指定できるようにした。EXECのみのリダイレクトを指定できるようにした。 --> clexescr.c, cltrexec.c, clprexec.c <2022.03.08> (12)文字列.'XXXXX'のXXXXXにシェルの文字編集指定を指定できるようにした。 --> cl_cmpt_comp.c <2022.03.12> (13)likeに最長一致モードと範囲指定"[]"中の否定"!"を追加した。 --> akxslike.c (14)REPLIKE(),INLIKE()に最長一致(Longest match)モードを追加した。 --> cl_cmpt_string.c <2022.03.14> (15)SHSBS()を追加した。 --> clconst.h, cl_gx_func_bexp.c, cl_cmpt_string.c <2022.03.23> (16)関数INREGXE()(cl_in_regex()),REPREGEX()(cl_rep_regex())を追加した。 SHSBS()の's'では、cl_rep_regex()を呼ぶようにした。 --> cl_cmpt_string.c <2022.03.24> (17)cl_in_regex(),cl_rep_regex()でオプションに'Z'が指定され、'(){}'のどれもがないときは、 likeで処理するようにした。 SHSBS()の'S'では、like処理とした。 --> <2022.03.28> (18)akxs_xlike_set_pat(),_get_maskctl()を新設し、akxs_xlike_new(),_pxlike_pos(),mkmask()の 引数、内部処理を見直した。pos[]は、akxs_pxlike()で指定するようにした。 --> axlib,h, akxslike.c <2022.04.01> (19)シフト演算時に、シフト数をチェックして、負とlongのビット数を超えているときは、エラーとした。 --> cl_cmpt_math.c <2022.04.10> (20)LENG()とLENW()に文字codeを指定できるようにした。 --> cl_cmpt_is.c <2022.04.11> (21)GETC(),GETCHAR()でto_codeをPUTC(),PUTCHAR()でfrom_codeを指定できるようにした。 --> clfuncfile.c <2022.04.11> (22)(F)GETLINE(),(F)PUTLINE(),(F)ELREAD1(),(F)ELWRITE(),(F)ELWRITE1()でfrom_codeとto_codeを 指定できるようにした。 --> clfuncfile.c, clfunc.c <2022.04.17> (23)clfuncfile.cの*pParmを*ppParm[]に変更した。 --> clfuncfile.c, cl_gx_func_bexp.c <2022.04.20> (24)スクリプト内にHereDocumentを指定できるようにした。 --> cllex.c, clexescr.c, cltrexec.c, clfuncfile.c, clclear.c, clmessage.c, cl_execute_proc.c, cllocal.h, cl_const.h, cmerror.h <2022.04.25> (25)オプション13で、printをFPUTLINE()で出力するようにした。 --> cl_user_func.c <2022.05.30> (26)プリントオプションにlを追加した。 --> cl_user_func.c (27)OPTIONおよびOPTIONSコマンドのオプション値の先頭に'+'または'-'を付けて指定ビットを 追加、削除するようにした。 --> cl_proc_bexp.c <2022.06.04> (28)EQ,iEQ,GT,GE,LT,LEも関数として実行できるようにした。 iGT,iGE,iLT,iLEを追加した。 --> cl_cmpt_comp.c, cl_gx_func_bexp.c, cl_gx_exp_imd.c, clconst.h (29)Free()の先頭で不正アドレスのチェックをしていたが、Malloc()チェックないしのfree()の前に 移動した。 --> akxmemtool.c (30)ハッシュキーのi指定時に、akxmemwork()を使うようにした。 --> akxshash.c(_dupcasekey) <2022.06.04> (31)AND,ORも関数として実行できるようにした。 --> cl_cmpt_logic.c, cl_gx_func_bexp.c, cl_gx_exp_imd.c, clconst.h <2022.06.08> (32)AND,OR関数をオプティマイズできるようにした。 --> cl_gx_compile.c (33)オプション26を追加した --> cl_gx_compile.c, clglobal.c, clconst.h <2022.06.14> (34)()=x,[]=xで「代入先がありません。」のエラーメッセージにした。 --> cl_gx_compile.c, cl_gx_rep_set.c, clmessage.c <2022.06.18> (35)RELACE(),REPCHAR(),REPSTRS()を追加した。 --> cl_cmpt_string.c, cl_gx_func_bexp.c, clconst.h, akxlib.c, akxlib.h <2022.06.20> (36)cct系に、reallocとfree機能を追加した。 --> akxmemtool.c, akxmemtool.h, cl_const_mem_get.c <2022.06.26> (37)コマンドライン オプションと設定ファイルでのオプション指定で+-を指定できるようにした。 --> cl_proc_bexp.c, coalmain.c <2022.07.12> (38)複素数をサポートした。以下を追加した。 cl_cmpt_math_real()からcl_cmpt_math()を呼ぶようにして、cl_cmpt_math()からの返却値を pInfoParmWに設定するようにした。 cl_gx_func_bexp()からは、cl_cmpt_math_info()を呼ぶようにし、cl_cmpt_math_info()の中で、 cl_cmpt_math_real()とcl_cmpt_complex()を呼び分けるようにした。 --> cl_cmpt_complex.c, cl_cmpt_math.c, cl_gx_func_bexp.c, cl_gx_compute.c, cl_conv_const_n.c, cl_user_func.c, clmessage.c, cl_gx_exp_imd.c, cl_gx_rep_prm_set.c, cl_chk_digit.c, akxconvn.c, akxlib.h, clconst.h, clprot.h <2022.07.17> (39)cl_gx_func_bexp()で、pInfoParmWに返却値を設定する処理をcl_set_parm()に統一した。 --> cl_gx_func_bexp.c <2022.07.18> (40)実行時オプション11に、「0x0100 表示有効桁数の指定がないときに、表示有効桁数を16にしない。」を追加した。 10進小数点数のデフォルトの表示有効桁数を16とした。 --> cl_cmpt_string.c, axlib.h <2022.07.25> (41)GETVAL()で、配列、リスト、データ並び、構造体、複素数を指定して要素を取り出せるようにした。 --> clfunc.c, cl_chk_digit.c <2022.08.05> (42)BASICのM_dateをCに移植した。 --> akxdatebas.c <2022.08.15> (43)COMPLEX()を追加した。 --> cl_cmpt_complex.c, cl_gx_func_bexp.c, cl_const.h (44)外部変数UINT_MAXとULONG_MAXの値をulongで持つようにした。 --> cl_conv_sysvar.c, clglobal.c <2022.08.18> (45)複素数の実数累乗をサポートした。複素数生成時のU指定を引き継ぐように修正した。 --> cl_cmpt_complex.c, cl_cmpt_math.c, cl_gx_exp_imd.c, clfunc.c <2022.08.19> (46)複素数と虚数どうしの比較、範囲どうしの比較をサポートした。 --> cl_cmpt_comp.c, cl_cmpt_complex.c, cl_gx_rep_prm_set.c, clmessage.c <2022.08.26> (47)arrayexp()の演算子に".."を指定できるようにした。 --> cl_gx_compute.c, cl_gx_exp_imd.c <2022.08.29> (48)数値関数実行で、errno<>0のときエラーメッセージを出力するようにした。 このときエラー終了するオプションを追加した。 --> clfuncmath.c <2022.09.01> (49)EXEC SH を追加した。system()をpopen、fgetline、pcloseに変更した。 シェル実行でエラーのとき、処理を中止するオプションを追加した。 --> clprexec.c, clfunc.c, cltrbexp.c, cltrexec.c, clglobal.c, colinit.c, akxlib.c clconst.h, cllocal.h, clprot.h, akxlib.h <2022.09.08> (50)exec_all_test.clをテストケースでブロック化し、テストケースを指定して実行できるようにした。 --> exec_all_test.cl <2022.09.10> (51)execパラメータの%n*形式の指定に、個数指定(%n,m*)を追加した。 また、開始と個数を式で指定(%(n,m)*)できるようにした。 --> cl_scparmset.c <2022.09.30> (52)cl_pr_ex_def_scalar_attr_info()で、変数定義のときには、最初に、'=','+='等以降を 実行しておき、変数定義が終わった変数に値を入れるようにした。(_mk_tmp_var_exp()をやめた) また、式の並びを実行し、最初の値をpInfoParmWで返す関数let_compute_prmp_infoW()を新設した。 let_compute_prmp_infoW()から呼ぶ関数let_compute_sub_opt()は、取得した値をppInfoParmまたは pInfoParmWで返せるようにした。 --> clprdef.c, cl_gx_compute.c <2022.10.08> (53)'`'で囲ってコマンドを実行できるようにした。 SQLコマンドでは、'`'はこの指定にならないようにした。 --> cllex.c, cl_path.c, clfuncfile.c, cl_gx_compile.c, clfunc.c, akxalog.c, akxblog.c, akxlib.c, akxlib.h, clconst.h, akbprot.h, akbmacro.h, clprot.h <2022.10.11> (54)GREP()関数を追加した。 --> cl_cmpt_string.c <2022.10.18> (55)毎回評価し直す変数を"$"から始まる一般変数としていたが、"$_"に変更した。 --> cl_gx_compile.c <2022.10.29> (56)eachループで、式の並び以外は、cl_iterate_info()を使うようにした。 この際、cl_iterate_info_init2()を新設し、メモリ確保関数を設定できるようにした。 eachループでは、malloc()が使われるようにし、ループ処理中は、確保したメモリが 無効にならないようにした。 --> clprloop.c, cl_gx_get_index.c <2022.11.17> (57)1文字のバイト数を求める関数akxqmbsnelen()で、UTF-8のときは、先頭1バイトのみで判定する akxqu8len()を呼ぶようにした。また、akxqu8len()は、処理を簡素化した。 --> akxcode.c <2022.11.21> (58)文字データの文字コードを有効とした。 --> cl_conv_const_c.c, cl_user_func.c, cl_cmpt_to.c, cl_cmpt_string.c, clfuncfile.c, cl_gx_func_bexp.c, clconst.h, clprot.h, akxcode.c, akxlib.h <2022.11.27> (59)FOR EACHの対象データに式の並びを指定したときもデータ指定単項演算子で要素が展開されるようにした。 また、cl_eof_parm(), cl_is_eof_parm()を追加した。 --> cpprloop.c, clmkscpt.c, cl_gx_get_index.c <2022.12.12> (60)PRINTOUTx,DEBUGOUTxをすべて、cl_log_out_opt_l5()を呼ぶようにした。 FERROROUTL,FPRINTOUTLをやめERROROUTL,PRINTOUTLを使うようにした。 ERROROUTRC,ERROROUTSをやめERROROUT1を使うようにした。 --> cl_user_func.c, cllog.c, cmmacro.h (61)defineでリダイレクトを設定できるようにした。 --> clprdef.c <2022.12.31> (62)データ並びの代入を再帰的に行うようにした。 --> cl_gx_compile.c <2022.xx.xx> (63) --> ******************************** * Bug fix * ******************************** <2022.03.03> (1)ユーザ関数名でprintfを指定すると、予約語ですのエラーになる。 [原因]printfはキーワードであり、キーワードを予約語エラーにしている。 [措置]キーワードであり組み込み関数名のときは予約語エラーにしないようにした。 --> cltrproc.c <2022.03.05> (2)EXEC IP でリダイレクトが効かない。 [原因]リダイレクト処理が入っていない。 [措置]リダイレクト処理を入れた。 --> cl_execute_proc.c <2022.03.10> (3)コメントの中にある引用符中のコメント開始/終了が有効になっている。 [原因]コメントの中では、引用符処理を行っていないため。 [措置]コメントの中では、引用符処理のみを行うようにした。。 --> cllex.c <2022.03.18> (4)xxxxx.$1, xxxxx.%1が「メンバー名[%1]が不正です。」のエラーになる。 [原因]$1,%1が変数名かどうかをチェックしているが、番号変数をエラーにしている。 [措置]番号変数をエラーとしないようにした。 --> <2022.03.28> (5)同じユーザ関数を複数回呼ぶケースで、1回目正常、2回目エラーとなったとき、関数の戻り値が 未設定のエラーにならない。 [原因]1回目正常になったときに作成された戻り値用変数が残っているため。 [措置]戻り値用変数を作成したときに、未設定にする。 --> cl_gx_func_bexp.c(cl_gx_func_method) <2022.04.01> (6)-1>>>1 は、OKだが、-1>>>2 は、NG; [原因]-1>>2 の後で、最上位ビットのみを0にしている。 [措置]ulong変数にしてから、シフトするようにした。 --> cl_cmpt_math.c (7)uint変数(-1を代入したもの)を浮動小数点数に代入すると、-1.0になる。 [原因]cl_get_parm_double()で整数値をdoubleに変換するときに、iAttr[2]のAKX_NUM_Uをチェック しているが、その前に呼んでいるcl_get_parm_mpa()のなかで、iAttr[2]を設定していない。 [措置]cl_get_parm_mpa()のなかで、iAttr[2]を設定するようにした。 --> cl_cmpt_math.c (8)浮動小数点数4294967295e0をintの変数に代入すると-1になる。 [原因]cl_get_parm_long()を呼んで、intに変換しているが、iUNSIGをチェックせずに、 cl_chk_over_flow_d2_ul()を呼んでいる。 [措置]iUNSIGがOFFのときは、cl_chk_over_flow_d2_l()を呼ぶようにした。 --> cl_cmpt_math.c <2022.xx.xx> (9)(arr+1)[0]が「配列名がないか不正です。」のエラーになる。 [原因]'('と')'の消滅処理で、')'の1つ前の属性を今回の属性としている。この例では、'1'(定数)が '['の1つ前と言うことになりエラーになっていた。 [措置]このようなときは、式という意味で3999(変数の属性の範囲にある)を今回の属性とする。 --> cl_gx_compile.c <2022.06.11> (10)local w++ = 1; の++処理でwが未定義エラーになる。 [原因] mc=14の処理で、POPしたpInfoParmが'U'のときは、wのParmNoと変数テーブルのpInfoParmを求めている。 しかしながら、これをPUSHするときに、tempのInfoParmにコピーして、S形式にしている。 次のmc=90の処理でPOPしたInfoParmがS形式のためこれのpInfoParmをwのアドレスとして、 値を代入している。 後置++処理用のスタックには正規のpInfoParmを入れているが、これに値が代入されていないため ++処理で、データ未定義エラーになった。 [措置] mc=14の処理で、POPしたpInfoParmが'U'のときは、変数テーブルのpInfoParmを求めず、U形式のままとした。 POPしたpInfoParmは後置++処理用のスタックに入れる。このときデータ未定義でUでないときは、 U形式のpInfoParmをtempに作るようにした。これを++処理では、処理の前に、UのときはwのpInfoParmを求めようにした。 PUSHするときは、U形式ならそのままPUSHし、それ以外のときはS形式にしてPUSHするようにした。 --> cl_gx_compile.c, cl_gx_get_index.c, cl_conv_parm.c <2022.06.14> (11)NVAL($dd,'NULL'),IIF(a,b,c)でno mallocが出る。 [原因]関数の戻り値は、mallocしたデータをfreeできるように、関数名と同じ名前のローカル変数を 作成しそれにコピーしてしる。このとき、戻り値に入力パラメータをそのまま返す処理で、 入力パラメータが変数のときにMALLOCフラグがONのままpInfoParmの内容がコピーされ、後で、 変数をfreeするときに変数のデータ域を2度freeするようになっていた。 [措置]オプションによりpInfoParmの内容をコピーした後でMALLOCフラグをOFFにする関数(cl_gx_copy_info_opt) を新設し、NVAL,NSVAL,NDEF,IIF,DECODE,?の処理では、それを呼ぶようにした。 --> cl_gx_compile.c, clfunc.c, cl_gx_func_bexp.c <2022.06.15> (12)式をオプティマイズしないとき、NVAL,NDEFがエラーメッセージなしのエラーになる。 [原因]cl_gx_rep_info_set()からcl_gx_copy_info()に変更したことで、retが0にならなくなっていた。 [措置]ret=0を入れた。 --> clfunc.c (13)式をオプティマイズしないとき、パラメータが多くてもエラーにならない。 [原因]パラメータが多くてもエラーにしていない。 [措置]ECL_TOO_PARAMETERを新設し、このエラーにするようにした。 オプティマイズで、パラメータが多いときは、ECL_SYNTAX_ERRORからECL_TOO_PARAMETERに変更した。 cl_gx_exp_gp_obj_opt_tree()で、このエラー時にエラーメッセージを出すようにした。 --> clfunc.c, cl_gx_exp_imd.c, cmerror.h <2022.06.16> (14)exec sm で落ちる。 [原因]直近のリダイレクト修正時に、cl_exe_scr_mem_init()中で呼んでいるcl_exe_scr_set_up()の 引数を修正していなかった。 [措置]cl_exe_scr_set_up()の引数を修正した。 --> clexescr.c (15)上記修正後、exec sm パラメータが取り込めていない。 [原因]最初のリダイレクト修正時に、パラメータを設定する処理が呼ばれないようになった。 [措置]cl_exe_scr_mem_init()中でcl_set_exec_parm()を呼んでパラメータを設定するようにした。 --> clexescr.c (16)上記修正後、exec sm でprocなしのエラーになり、落ちる。 [原因]cl_set_exec_parm()の中で、これから実行するscrのprocをサーチして、procなしになっている。 エラーリターンした後で、procをサーチし、フラグを立てるところで落ちている。 [措置]cl_set_exec_parm()では、これから実行するscrのprocは不要なので、サーチを止めた。 procをサーチし、フラグを立てるところでは、procがNULLならエラーリターンするようにした。 --> clexescr.c, clnode.c <2022.06.17> (17)TO_NUMBER('1,234,567,890',4,15,-3,2)で、数字以外の文字があるのエラーになる。 [原因]'1,234,567,890'が10桁以下のため整数として変換され、エラーになっている。 [措置]整数と2進浮動小数点変換で、カンマを無視するオプションのときは、カンマを削除してから 変換するよにした。また、optにopt17をORするようにした。 --> akxlib.c, cl_conv_const_n.c (18)inputXMLで落ちる、デバッグ出力すると落ちる。 [原因]外部関数実行時に、新規procのリダイレクト変数に元のprocの値を設定していない。 外部関数には、leafが存在しない(leaf==NULL)が、leafのコマンドラインを出力している。 [措置]設定するようにした。leafがNULLのときは、コマンドラインに"no leaf"を出力するようにした。 --> clprexec.c, clnode.c <2022.06.19> (19)replike()で、startとlenを指定し、文字列の途中を対象としたとき、置換結果に対象とした途中の 後ろが正しく出力されない。 [原因]対象とした途中の後ろのバイト数を求めるときに、len[5]ではなくlen[0]を使っている。 [措置]len[5]を使うようにした。 --> cl_cmpt_string.c <2022.06.21> (20)32バイト以上の境界調整ができていない。 [原因]32バイト以上を設定していない。 [措置]32バイト以上は、16バイト境界とした。 --> akxmemtool.c <2022.06.24> (21)手続きや関数に渡されたargcを減算すると定数エラーになる。 [原因]定数にしている。 [措置]定数にしないようにした。 --> clprproc.c (22)putline(fgetline(fp))でEOFになってもエラー終了しない。 [原因]fgetline(fp)の終了時にpGlobTable->errorを見ていない。 [措置]関数実行後にpGlobTable->error<0のときは、式の実行を正常終了する。 --> cl_gx_compile.c <2022.06.24> (23)$ERRORのeofエラーを判定できない。 [原因]システム変数EOFにc言語のEOFを設定している。 [措置]ECL_END_OF_FILEを設定するようにした --> cl_conv_sysvar.c (24)オプション7の0x10がOFFのとき、EOFのERRMSGが設定されない。 [原因]TRYモードのときかオプション7の0x10がONのときのみERROROUT()を呼ぶようにしていたが、 ERROROUR()の中でERRMSGを設定するようになっている。 [措置]EOFのときは、無条件にERROROUT()を呼ぶようにし、ERROROUT()の中でオプション7の0x10が ONのときは、TRYモードのときと同じにした。 --> clfuncfile.c, cllog.c <2022.06.25> (25)while putline(fgetline(fp));これがEOFで偽にならない。 [原因]fgetline(fp)でEOFになったとき、pGlobTable->errorにエラーが設定されるが、正常終了するため putline()で、pGlobTable->errorが0になる。 [措置]上記でfgetline(fp)をエラーリターン(EOF)させ、戻り値はNULL文字にし、EOFエラーのときは、 以降の関数実行をスキップするようにした。 また、オプション7によってこのときの挙動を選べるようにした。 --> clfuncfile.c, cl_gx_compile.c, cl_gx_exp_imd.c, cl_gx_func_bexp.c, cl_conv_sysvar.c, clglobal.c, clconst.h, cmerror.h <2022.07.02> (26)tryでオープン済みファイルを設定してもクローズされない。 [原因]ファイルオープン時に、iParm[2]にD_AULN_FILE_POINTERを設定しているが、 <2021.09.13>(1)のBugFixでInfoParm.alenにiParm[2]を設定しないようにしていた。 また、cl_gx_func_bexp()の最後で、InfoParm.alenにiParm[D_IPARM_OVER]を設定しているため、 iParm[2]の設定が消えている。 [措置]iAULNという変数を新設し、ファイルオープン時とiParm[D_IPARM_OVER]が設定される可能性がある 関数呼び出しcl_cmpt_to_number(),cl_cmpt_math()のときのみ、iAULNを設定するようにし、 cl_gx_func_bexp()の最後では、iAULNを設定するようにした。 --> cl_gx_func_bexp() <2022.08.26> (27)データ型ありの配列に符号なし、虚数を保存できない。 [原因]データ型ありの配列では、データのみを保存するため。 [措置]データ域の後ろにpi_scaleの値を保存するようにした。 --> cl_array.c, cl_gx_rep_set.c <2022.08.27> (28)123..'345i' が複素数にならない。 [原因]'345i'の数値変換前に虚数かどうかを判定しているため。 [措置]判定前に数値変換するようにした。 --> cl_cmpt_math.c, cl_gx_exp_imd.c (29)TOの'Uint'がintになる。 [原因]attrのDEF_ZOK_USMASKビットを考慮していない。 [措置]考慮するようにした。 --> cl_cmpt_to.c, cl_gx_compute.c, cl_gx_func_bexp.c <2022.09.01> (30)HereDoc中にpopenしたfpがEOFになるとHereDocが解除される。 [原因]HereDoc中にfpがEOFエラーになったとき、無条件にHereDocを解除している。 [措置]HereDoc中のfpと対象のfpが同じときのみHereDocを解除するようにした。 --> clfuncfile.c <2022.09.08> (31)exec_all_test.clで、list_test.txtの全てを実行すると、test_msg.clを実行したときに、 akb_create_pk_data()の中で、tpSendMsgCom->msg_filvがNULLのエラーになる。 [原因]test_msg.clの前に実行しているスクリプトの中でSLEEPを実行したときに、tpSendMsgComの 領域を0クリアしている。また、LEAVEでは、tpRecvMsgComの領域をtpSendMsgComの領域に コピーしている。 [措置]0クリアまたはコピーの前にtpSendMsgCom->msg_filvを退避し、0クリアまたはコピーの後で 元に戻すようにした。 --> clpsnd.c, cl_proc_leave.c (32)exec_all_test.clで、test_msg.clを実行するとメッセージを送信したあとで終了しない。 [原因]exec_all_test.clでは、関数の中でtest_msg.clを実行しているが、関数を実行すると 関数用の_msg_proc()を実行する。その中で、tpMsgComの中からiWaitTimeを取り出して、 aka_send_msg_wait_time()に渡している。このとき、iWaitTime>0だとその時間waitする ようになっている。msg_sendでは、メッセージの後ろにiWaitTimeを設定しているが、 _msg_proc()では、pDTD->lretから取り出していた。pDTD->lretが、たまたま正の大きい値 だったため、ずっと待っていて終了しなかった。 [措置]msg_sendのとき(tpMsgCom->msg_disp & 0x1000がON)は、メッセージの後ろからiWaitTimeを 取り出すようにした。 --> cl_execute_proc.c <2022.09.15> (33)関数パラメータに未設定変数を指定してもエラーにならない。 [原因]cl_gx_func()で_ex_conv_parm_opt()を呼ぶときに、エラーにしないオプションを設定している。 [措置]オプションを0にした。 --> cl_gx_exp_imd.c <2022.09.16> (34) [1,2,3,4]|{4,1,5} ==> [1,2,3,4,4,1,5] になる [原因]_list_minus_sub()で、pInfoParm1が'L' or 'N'のとき無条件に展開している。 この例では、{4,1,5}がpInfoParm1になっている。 [措置]_list_minus_sub()に最初の式の第1項のidを渡し、pInfoParm1のidとそれが等しいときのみ 展開するようにした。 --> cl_gx_rep_prm_set.c (35)生成したインスタンスを変数に入れ、その変数を使ってリスト変数を作成すると、終了時に落ちる。 [原因]インスタンス変数をfreeした後で、リスト変数をfreeするときに、インスタンス変数をfree しているため。 [措置]D_DATA_ORG_PROCを新設し、インスタンス生成時にそれを設定する。インスタンスをコピー するときには、D_DATA_ORG_PROCが立っていなかたらD_DATA_COPIED_PROCを立てる。立って いたらクリアする。(D_DATA_COPIED_PROCが立っているとfreeされない) --> clconst.h, cl_class.c, cl_gx_rep_prm_set.c <2022.09.20> (36)akxcctox()で、'a'〜'f'が正しく変換されない。 [原因]if ((uc>='a') && (uc<='f')) uc -= 'a' + 10; ==> uc = uc - 'a' + 10 のつもり。 [措置]"+ 10"を"- 10"にした。 --> <2022.09.24> (37)構造体定義名 x=1,'AAA'; が、演算子なしのエラーになる。 [原因]cl_process_let()では、intやlocalのような修飾子が付いているときは、cl_pr_ex_def_array()を 呼べているが、構造体定義名のときは、let_compute()を呼んでいるため。 [措置]構造体定義名の次が名称文字列のときは、構造体定義情報等を渡してcl_pr_ex_def_array()を 実行できるように、cl_pr_ex_def_array_parm()を作成して呼ぶようにした。 cl_pr_ex_def_array_parm()では、構造体定義情報等があるときは、これを再取得しないようにした。 --> cl_proc_bexp.c, clprdef.c /**************************************************************************** (38)local dd=40,'CCC'; で、「ppInfoParmには代入できません。」のエラーになる。 [原因]cl_pr_ex_def_scalar_attr_info()では、変数のアドレスを返せるように、let_compute_info()を 呼んでいる。これは、式全体を処理するため、「,'CCC'」の結果を返しているが、それは、 S形式で返していないため上記エラーとなった。 [措置]cl_pr_ex_def_array()で、スカラー変数のときは、変数定義にならないときのみ、 cl_pr_ex_def_scalar_attr_info()に代わって、let_compute()を呼ぶようにし、との時は、 アドレス変換なしで、cl_pr_ex_def_scalar_attr_info()を呼ぶようにした。 --> clprdef.c *********************************************************************************/ (39)関数に渡されたargcがshift localしても減らない。 [原因]No.10のBug修正時の影響。mc>=14,mc<=17のときは、演算結果のpInfoをそのままS形式にしているが、 その他のときは、演算結果をtempのInfoParmにコピーしそのアドレスをS形式にしているため。 [措置]代入処理(mc>=71 && mc<=90)のときは、演算結果のpInfoをそのままS形式にするようにした。 --> cl_gx_compile.c <2022.09.25> (40)local const int cc=30, private gg='BBB'で、'BBB'が数値変換エラーになる。 [原因]スカラー変数の初期値設定で、複数個のデータが指定されたときは、最後を代入している。 [措置]最初を代入するようにした。 --> clprdef.c (41)char cc='1'; local int cc=30; で、ccが'30'になる。 [原因]配列や構造体でない定義済み変数のデータタイプを設定していない。 [措置]データタイプを設定するようにした。 --> clprdef.c (42)local cc=30, private gg='BBB';で、ggがlocalになる。 [原因]cl_skip_scope_mark()で取得したscopeをoptにorしている。cl_pr_ex_def_scalar_attr_info()が 呼ばれたとき、optには、LOCALビットが設定されている。 [措置]optにorする前にscopeビットをクリアするようにした。 --> <2022.09.27> (43)print %argv[0];を--d2,200で実行すると落ちる。 [原因]cl_debug_out_info_parm5()の最初で、引数のa1〜a5をformatで変換してfmtに入れている。 このfmt使って後でさらにフォrマット変換している。a1が"%argv[0]"のとき、これが、 fmtにそのまま入り、後のフォrマット変換で、%aの変換をして落ちている。 [措置]_per_check()を使って、"%%argv[0]"になるようにした。 --> cllog.c <2022.10.04> (44)$1 = '/tmp/coal_mini/src/appl/coal/clnest.c'; n = 1; name = left($(n).'##*/',-2); で、mallocエラーになる。 [原因]likeの最長一致で、残りの長さが0になるまで、一致ヶ所をサーチしているが、残りの長さの 計算で、サーチ開始前の長さから今回の一致位置までの移動長さを引いていた。 その結果、最後に一致した位置の次からの残りの長さが負になり、負の長さをmallocして エラーになっていた。 [措置]残りの長さの計算では、前回の残りの長さから引くようにした。 --> akxslike.c <2022.10.07> (45)print [1,2,3]|3; で落ちる。 [原因]_list_minus_sub()で、c1(3に対応)が'L'でも'N'でもないときは、c2([1,2,3]に対応)を 設定している。これは、c1とc2が'L'が'N'で、c1==c2のときのみ、c2を展開してxhpSに、 登録するための措置である。そのために、3をリストとして処理しようとして落ちている。 [措置]上記措置をやめ、c1とc2が'L'が'N'で、c2==id1のときのみ、c2を展開してxhpSに登録するようにした。 --> cl_gx_rep_prm_set.c <2022.10.08> (46)コメント中の引用符の中の連続する引用付が引用符の終わりになる。 [原因]連続する引用付の2つ目を読んで入るのに、次に読む位置を進めていない。 [措置]上記で、進めるようにした。 --> cllex.c <2022.10.16> (47)"cat $x"を実行すると"Undefined variable"のエラーになるが、このメッセージも出力されず、 fgetline()で止まる。 [原因]fpが子プロセスの標準出力に結び付けられず、親プロセスの標準入力のままになっている。 そのため、fgetline()を実行すると何か入力するまで子プロセスが終了しない。 [措置]select()を使って、一定時間入力(2秒)がなかったらエラーになったものとする。 --> clfunc.c, clfuncfile.c, clconst.h <2022.10.22> (48)test_grep.clを実行すると、print grep(`!cat test_agg.cl`,'E.*R');で落ちる。 [原因]式で使うobj0をObjで保持しているが、`!cat test_agg.cl`を実行したときに、Objのobj0が realloc()されたために、grep(...)実行中のobj0が無効になり、`!cat test_agg.cl`の実行から 復帰してgrep(...)の処理を続けようとしてobj0を使用して落ちた。 [措置]cl_gx_ex_obj()には、Objとその式で使うobj0の開始位置を渡し、obj0を使うときは、毎回、 Objからobj0を取得するようにした。 --> cl_gx_compile.c, cl_gx_exp_img.c, cl_if_comp_ctl.c <2022.10.28> (49)akxs_rb_set_n()をしないで、akxs_rb_get_n()をすると、構造が壊れる。 [原因]初期構造を取り出してしまい、構造を壊している。 [措置]pCt->rb_used>0 のときのみ、取り出せるようにした。 --> akxsrblist.c <2022.11.04> (50)print 1.0.sin().asin();で、意味の異なるエラーが出る。 [原因]数学関数実行前に、errnoを0にしていなかったため。 [措置]errno=0とし、feclearexcept(FE_ALL_EXCEPT)も実行するようにした。 さらに、エラー判定に、fetestexcept(FE_INVALID等)を追加し、対応するエラーをstrerr()の 後ろに、括弧付きで出力するようにした。 --> clfuncmath.c, colmn.h <2022.11.06> (51)pritf()とlprintf()が末尾に改行コードを出力する。 [原因]opt=1とopt=3でcl_print_echo_text_out()を呼んでいるので、print()とlprint()と同じになっている。 [措置]opt=0x81とopt=0x83とし、このときは、末尾に改行コードを出力しないようにした。 --> cl_proc_bexp.c, cl_user_func.c <2022.11.17> (52)UTF-8-->S-JIS変換でJIS_X_0213の追加コードが変換エラーになる。また、0x5cと0x7eが変換エラーになる。 [原因]iconv()の変換コード文字にCP932を指定している。 [措置]gCodeStr[]にSHIFT_JISX0213,SHIFT_JIS-2004,EUC-JISX0213,EUC-JIS-2004を追加し、 SHIFT_JISX0213が使用されるようにした。 0x5cと0x7eの方は、akxc_str_conv_iconv()のoptにfromがUTF-8のときは、0x5cと0x7eでエラーになっても そのまま、0x7eをセットするフラグを設定し、そのフラグが立っていたらそのようにするようにした。 --> akxcode.c, axlib.h (53)UTF-8のBOMで変換エラーになる。 [原因]BOMを変換している。 [措置]BOMを読み飛ばすようにした。 --> akxcode.c, clfuncfile.c (54)スクリプト終了時に、エラーログを出力しようとして落ちる。 [原因]エラーログ出力では、同じ行で同じメッセージを出力しないように制御するために、 現在のprocを取得しているが、スクリプト終了時にはこれが無効になっているにもかかわらず カレントのleafを使って現在行を参照して落ちている。 [措置]proc削除時に、上位procがないときは、スクリプトのカレントprocとpCLprocTableの現在procの値をNULLにするようにした。 また、script削除時に、上位scriptがないときは、pCLprocTableの現在procの値をNULLにするようにした。 --> clerproc.c, clerscpt.c <2022.11.19> (55)dev1,dev2環境をLANG=UTF-8にすると落ちる [原因]cl_code_trans()で、スクリプト名の文字コードがシステムの文字コードと同じときは、 変換後のpInfoParmdを0クリアのみしてリターンしている。 cl_code_trans()を呼び出している_get_script_name_from_parm()では、変換後のアドレスの NULLチェックと長さの0チェックをせず、処理を継続して落ちている。 [措置]_get_script_name_from_parm()に変換後のアドレスのNULLチェックと長さの0チェックを追加。 cl_code_trans()で、スクリプト名の文字コードがシステムの文字コードと同じときは、 入力のpInfoParmの内容をpInfoParmdにコピーするようにした。 --> cl_code_trans.c, cl_get_script_name.c (56)say()とecho()が改行しない。 [原因]_func_print_sub()で、opt==0のときに改行していない。 [措置]opt==0のとき改行するようにした。 --> cl_user_func.c <2022.12.11> (57)felread1()を実行すると、文字コードが不正のエラーが出る。 [原因]_func_file()リターン時には、iParm[2]に文字コードを設定することにしているが、 _func_felread1()リターン時には、dec_sizeで上書きしている。 [措置]iParm[2]には、最初に0を設定するようにし、リターン時には設定しないようにした。 (データが文字のときは、入力後の文字コード変換で設定している) --> clfuncfile.c (58)s = s.pos;で、sに正しいデータが入らない。 [原因]cl_gx_str_pos()では、入力pInfoParm1(sのもの)からparm_to_char()を使用して文字列を 取り出しているが、その文字列のアドレスがsのものであり、この領域をpInfoParmWで返している。 これをsに代入する再にsの文字列をFreeしているので、pInfoParmWで返した領域がなくなり、 結果としてsには不正なデータが入った。 [措置]pInfoParmWに設定する前にtmpに入れるようにした。 --> cl_cmpt_comp.c <2022.12.12> (59)stderrが、">& result.txt"でリダイレクトされない。 [原因]_set_redirect()の中で、std_errに1を設定しているが、result.txtが次のパラメータに なっているために、_set_redirect()からリターンし、再度_set_redirect()が呼ばれて stderrのリダイレクトを設定しているが、std_errはauto変数で_set_redirect()の頭で 0クリアしているためにstderrのリダイレクトが設定されていない。 [措置]std_errをtdtREDIRECT_CTLに入れて0クリアされないようにした。 --> clexescr.c (60)xdumpで、"f0 00 00"がUTF-8のマルチバイトと判断される。 [原因]先頭1バイトで判定しているため。 [措置]複数バイトで判定するように戻した。 --> akxcode.c <2023.1.1> (61)treeモードで、a=-2;b=2;c=3;d=4;if ((c=(a+2))) && (c=(b+3,d+4)) thenのc=(a+2)がゼロなのに falseで抜けない。 [原因]c=(a+2)実行後の、true判定をcl_get_logic_val()で行っているが、pInfoParm1->pi_idが'S'の 処理を行っていない。 [措置]'S'の処理を行うようにした。 --> cl_cmpt_logic.c <2022.XX.XX> (62) [原因] [措置] -->