coal 7.1.1の機能改善およびバグfix ******************************** * 機 能 改 善 * ******************************** <2021.09.09> (1)式を実行中は、tmpメモリーを使うようにし、配列とリストを変数に代入するときは、mallocしたエリアに 全てのデータをコピーするようにした。 --> akxlib.h, akxshash.c, cl_gx_rep_prm_set.c, clprloop.c, cl_gx_compile.c <2021.09.10> (2)上記対応で漏れていた箇所を修正した。 --> cl_gx_rep_prm_set.c, cl_gx_compile.c, clfunc.c, cl_gx_rep_set.c <2021.09.21> (3)**の計算で、31以下のときは、データタイプの数値の掛け算にした。 --> cl_cmpt_math.c <2021.09.26> (4)整数どうしの演算でオーバーフローしたときは、10進浮動小数点数に変換するようにした。 --> cl_cmpt_math.c, cl_conv_const_n.c <2021.09.29> (5)式がデータ要素(単一の数値定数、文字定数、変数等)のときは、直ちに変換するようにした。 --> cl_gx_exp_imd.c <2021.10.02> (6)akxtstrim2()を使わず、旧akxttrim()の方式のakxttrim2()を作成した。 また、akxttrim()はakxttrim2()を使うようにした。 --> akxlib.c (7)(5)の前に、akxqnumber()を使って、単一の数値定数のときは、直ちに変換するようにした。 また、akxqnumber()では、akxttrim2()を使って、後方のみをtrimするようにした。 akxqnumber()のoptに、AKX_CNVN_OPT_MSIGNとAKX_CNVN_OPT_FU_MPAを追加した。 --> cl_gx_exp_imd.c, akxconvn.c, akxlib.h <2021.10.05> (8)ハッシュ配列のINDEXA()で、キーが未登録のときに、エラーメッセージを出すようにした。 --> cl_gx_rep_set.c(cl_func_index) <2021.10.06> (9)proc内の配列定義で、変数が定義済みで、静的型付けか定数以外のときに、定義済みのエラーメッセージを出すようにした。 --> clprdef.c <2021.10.08> (10)MPAの最大精度を2〜54で指定できるようにした。 --> akxmpa.c, cl_gx_finc_bexp.c, clfunc.c, clconst.h <2021.10.09> (11)上記、55以上を指定できるようにした。 --> akxmpa.c, cltrbexp.c, cl_cmpt_math.c, cl_conv_const_n.c, cl_gx_compute.c, cl_gx_exp_imd.c, clfunc.c, clfuncfile.c, clprdef.c, cl_array.c, cl_cmpt_comp.c, cl_cmpt_date.c,cl_cmpt_to.c, cl_gx_compile.c, cl_gx_func_bexp.c <2021.10.11> (12)log(2)とPI2の文字列を100桁とした。また、log(2)のMPA定数の桁数を100桁までにした。 --> akxmpa.c, axlib.h <2021.10.15> (13)GETCHAR()とPUTCHAR()を追加した。 --> clfuncfile.c, cl_gx_func_bexp.c, clconct.h <2021.10.19> (14)concat()に、配列、リスト、データ並びを指定したときは、その要素を対象にできるようにした。 iterate関数を追加し、適用した。 --> cl_cmpt_string.c, cl_gx_get_index.c (15)countv()で、複数の引数を指定できるようにした。optは、名前付き引数"OPT"で指定するようにした。 --> clfunc.c <2021.10.24> (16)MAX,MIN機能に、iterate関数を適用した。 --> cl_cmpt_comp.c <2021.10.25> (17)PRINTコマンド系に、循環参照チェックを組み込んだ。 --> cl_user_func.c (18)IN,iIN機能に、iterate関数を適用した。 --> cl_cmpt_comp.c ******************************** * Bug fix * ******************************** <2021.09.13> (1)test_conv.clを実行すると、no mallocのエラーがでる。 [原因]EOFのとき、返却されるInfoParm.alenにiParm[2]が設定されおり、iParm[2]は、レコード先頭を 読み込むfelread1(fp,1,2)のsize=2が入っていた。InfoParm.alen=2は、PARMINFO2を示しているため、 未定義のInfoParmの後ろのエリアのpi_dataをfree()していた。 [措置]InfoParm.alenにiParm[2]を設定しないようにした。 また、iParm[2],iParm[3]が本来の意味とずれていたので、felread1()リターン時に、 本来の意味に合わせた。 --> cl_gx_func_bexp.c, clfuncfile.c(_func_felread1) (2)test_conv.clで、2レコード目のprint /i で、localが出ない。 [原因]以下で、pi_aux[1]がクリアされている。 (1)1レコードの「a = conv(a1,leng(a1));」で、convのretがaに代入されるときに、cl_gx_rep_info_copy_data()で、 aのpi_aux[1]のscopeがクリアされる。 (2)1レコード目の「print a」では、aのobj0は未定義のため、cl_gx_get_lg_var_ent_psize()の中で、 変数aのpi_aux[1]にlocalが設定され、localが表示される。 (3)2レコードの「a = conv(a1,leng(a1));」で、(1)と同じに変数aのpi_aux[1]にlocalが設定される。 (4)2レコード目の「print a」では、aのobj0は定義済みのため、変数aを直接参照する。(3)でpi_aux[1]のlocalは、 クリアされているので、localが表示されない。 [措置]上記、aに代入する処理_rep_info_set2()で、変数aのpi_aux[1]のscopeを保存しておき、代入後に、これを戻す。 --> cl_gx_rep_prm_set.c(_rep_info_set2) <2021.09.18> (3)64ビット環境で、test_felwrite1.clを実行すると落ちる。 [原因]整数を出力処理で整数値へのポインタを設定するときに、&が付いていない。 [措置]&を付けた。 --> clfuncfile.c(_felwrite1) (4)test_str_add.clを実行すると落ちる。 [原因]加算される文字列がNULL文字列のとき、rstr_exp_num()中で呼ぶ_get_char_num()の引数のstrnumが 未設定となり不正な値になる。 [措置]rstr_exp_num()最初でstrnumをNULLとし、_get_char_num()の最初では、strnumNULLのときNULL文字列にする。 --> cl_cmpt_strnum.c(rstr_exp_num, _get_char_num) (5)cl_user_func.c(_print_info_array)の"else {"をコメントにしたときの対応しない"}"をコメントにしていた。 [原因]不注意 [措置]対応する"}"をコメントにした。 --> cl_user_func.c(_print_info_array) <2021.09.24> (6)INT_MINを定数で設定するとオーバーフローになる。 [原因]"-"符号と数字列を別オブジェクトで処理しているため、INT_MAXの数字列とINT_MINの数字列を 区別できない。 [措置]cl_cvn10()のリターン値が(-3)のときは、数字列をDECIMALに変換し、INT_MINの絶対値のときは、 オーバーフローにしないようにした。 cl_cmpt_math()の頭で、上記を判定し、"-"の単項演算でINT_MINの絶対値のときは、INT_MINの整数として 返すようにした。"-"の単項演算以外でINT_MINの絶対値のときは、オーバーフローとし、INT_MAXの整数と して返すようにした。 <<<問題点>>> "2147483648"のみが、オーバーフローにならない。 "-(2147483648)"がオーバーフローにならず、INT_MINの整数になる。 --> cl_conv_const.c, cl_cmpt_math.c (7)INT_MINをMPAに変換すると不正な内容になる。 [原因]akxconvn.cと同じ原因。 [措置]akxconvn.cと同様に修正した。 --> akxmpa.c <2021.10.03> (8)test_inter.clで入力文字定数中の\と~が化ける。 [原因]SJIS<->UTF-8変換表で、\と~が倍角文字に対応している。 [措置]\と~が元のASCIIコードに対応するように変換表を修正した。 make_ucodeとsjis0213.txtを使用して、mk_ucode2.datを生成し、akxutf8_src.cを再作成した。 make_ucode sjis0213.txt > mk_ucode2.dat --> sjis0213.txt, akxutf8_src.c (9)test_inter.clで^と\が正しく機能しない。 [原因]^と\のとき、編集文字の位置を1バイト後ろにしていない。 [措置]^と\のとき、編集文字の位置を1バイト後ろにした。 --> cl_path.c <2021.10.06> (10)CStr()を使うとメモリーがFree()されない。 [原因]CStr()では、cl_set_parm_init(),cl_gx_rep_info_set(),_gx_rep_val_set(),_set_mem_size_zero()が呼ばれるが、 cl_gx_rep_info_set()のみD_GX_OPT_ALC_TMPが指定されていて、他では、Malloc(),Realloc()が 使われており、D_DATA_MALLOCがONになっていない。 [措置]cl_set_parm_init()にD_GX_OPT_ALC_TMPを立てる。_gx_rep_val_set()と_set_mem_size_zero()の引数にiOptを追加、 _set_mem_size_zero()でcl_opt_malloc()を使うようにした。 --> cl_gx_compute.c(cl_gx_cast), cl_gx_rep_prm_set.c(_set_mem_size_zero,_gx_rep_val_set,cl_gx_rep_info_set_name), clprdef.c(cl_pr_ex_def_scalar_attr_info) <2021.10.10> (11)MPAの最大精度に66を指定して、test_mpa_piを実行すると、落ちる。 [原因]m_100to10()で、10進にするときに、100進の先頭が10を超えるときは、10進の先頭に0を入れて、 1バイトつずらしているが、最後の1バイトが、giNMPA2を超える場合をチェックしていない。 [措置]10進の設定位置が、giNMPA2を超えるときは、そこでループを抜けるようにした。 --> cpxmpa.c(m_100to10) <2021.10.11> (12)MPAの最大精度に66を指定して、test_mpa_ln.clを実行すると、落ちる。 [原因]m_precision_10で、指定精度より後ろからlenまでを0クリアしているが、クリアする長さが1バイト多い。 [措置]len+1をlenとした。 --> cpxmpa.c, m_precision_10 <2021.10.13> (13)0.0を指数表示すると落ちる。 [原因]m_mpa10_to_exp()で、0.0のときの判定が入っておらず、len-1が0xffffffffになった。 [措置]0.0のときの判定を入れ、lenが0以上になるようにした。 --> cpxmpa.c <2021.10.23> (14)parm_to_char()で、日付を変換すると末尾の1バイトが欠ける。 [原因]変換に、cl_date2uxstr()を使っており、その中でstrftime()を読んでいる。これに指定するlenが1バイト足らない。 このlenは、終端のNULL文字を含んでいるが、含まない長さを指定している。 [措置]cl_date2uxstr()のlenを19->20とした。 -->cl_cmpt_string.c(cl_parm_to_char_opt)