coal 7.3.1の機能改善およびバグfix ******************************** * 機 能 改 善 * ******************************** <2023.01.06> (1)FILEの代わりにM_FILEを定義して使うようにした。 --> axlib.h, axafile.c, akxalog.c, makefile, makefile_no_u8src, makefile_no_iconv, cllocal.h, clfuncfile.c, clexescr.c, clprexec.c, colinit.c, clglobal.c, coalmain.c cl_user_func.c, cl_conv_sysvar.c, cllex.c, cllog.c, cl_path.c, clfunc.c <2023.01.17> (2)HEREDOCのデータをメモリーから入力するようにした。 --> cllex.c, clexescr.c, clfuncfile.c <2023.01.21> (3)debugは、リダイレクトしないオプション(25 0x400)を追加した。 --> cllog.c <2023.01.22> (4)HEREDOCのデータをオプションによりファイルからも入力できるようにした。 --> axafile.c, clfuncfile.c, clexescr.c, cllex.c <2023.01.23> (5)cl_tmp_const_malloc()等で、呼び出し位置がmemory.logに出るようにしたマクロを定義した。 --> cmmacro.h, akxmemtool.h, akxmemtool.c, cl_const_mem_get.c <2023.02.08> (6)算術式に、配列名+リストまたはデータ並び式を追加して、次元の要素数を指定できるようにした。 --> clpedef.c, cl_array.c, clmessage.c, clprot.h <2023.02.13> (7)Parm_to_char()で、範囲値または複素数をその形式で取得するようにした。 上記を取得しないオプションを追加した。 --> cl_cmpt_string.c <2023.02.22> (8)compile処理では、xxxx.yyyyの形式のyyyy(直前が'.')は、変換せず名前変数にし、 '.'実行(mc=29)のときに、xxxxのidによってyyyyを変換するようにした。 --> cl_gx_compile.c /************ 他への影響が大きすぎるの止めた ************** <2023.02.24> (9)CLASS内部のときは、スコープなしの変数定義は、LOCALにするようにした。 --> clpedef.c, cl_gx_compile.c ***************************/ <2023.02.25> (10)let define, let scalarを使用できるようにした。 --> clpedef.c, cl_proc_bexp.c, cltrbexp.c, cltrdef.c, clprdeftype.c, clconst.h <2023.03.08> (11)文字コードの変換元/先がUTF-8のときは、文字列中に"\"、"~"があるかどうかを調べ、あるときは、 iconvを使わないようにした。また、このチェックを行わないオプションも追加した。 --> akxcode.c, cl_cmpt_string, clfuncfile.c, akxlib.h <2023.02.09> (12)ARRAYMAP()関数のインデックス指定に、リストまたはデータ並び式を指定できるようにした。 --> cl_array.c <2023.03.10> (13)ASでない変数定義で、複数の変数に初期値設定できるようにした。これと引き換えに 設定できる値は、1個になった。これらはオプションで変更可能。複数の値を設定したいときは、 データ並び式に'*'を付けることにした。 --> clpedef.c, clprdeftype.c, cl_array.c <2023.03.12> (14)STR_CONV()関数で、"UPPER","LOWER","PROPER","HEBON"を指定できるようにした。 --> akxcode.c, cl_cmpt_string.c, cl_conv_sysvar.c, clglobal.c, akxlib.h <2023.03.30> (15)ローマ字変換の前に辞書による英単語への変換を可能として。 --> akxcode.c, cl_cmpt_string.c (16)akxstrsort_inx_vdat()をVBAから移植した。 --> akxlib,c, akxlib.h <2023.03.31> (17)辞書への登録/削除/参照関数を追加した。 --> akxcode.c cl_func.c (18)固定長要素列をソートする関数akxnmstrsort_opt()で、qsort_r()を使うようにした。 --> akxlib.c, akxlib.h (19)クィックソート関数akxqsort_r()を追加した。 --> akxlib.c, akxlib.h <2023.04.09> (20)フリガナ変換機能を実装した。 --> akxcode.c, akxcodeap.c, cl_cmpt_string.c, akxlib.h <2023.04.12> (21)hasxに衝突回数を数えて返す機能を追加した。 --> akxshash.c (22)hasxで、オプションをid[1]に持つようにした。 --> akxshash.c, akxlib.h <2023.04.13> (23)hasxでmaxreg<=65535のときは、エントリ配列等をushortで取るようにした。 --> akxshash.c, <2023.04.17> (24)スクリプト開始時に、エラーメッセージ域をクリアするようにした。 --> clclear.c, clexescr.c, cl_process_end_if.c <2023.04.23> (25)PROC,FUNCTIONの仮引数にCONSTを指定できるようにした。 --> clprproc.c <2023.XX.XX> (26) --> ******************************** * Bug fix * ******************************** <2023.01.25> (1)sample_fibonacci.clを実行すると、2回目のwhile a < 4;で、「cl_gx_bexp: ポインタは、演算できません。」の エラーになる。 [原因]aが、2重の'S'形式になっている。これは、[a, b] = [b, a+b];の処理で、bをaに代入する処理を _rep_info_set2()で行っているが、bが'S'形式であるのに_ex_conv_parm_opt()で処理していないために、 aに'S'形式で代入され、後続の処理で、さらに、'S'形式にされていた。 [措置]代入の前に、bを_ex_conv_parm_opt()で処理するようにした。 --> cl_gx_compile.c <2023.01.28> (2)y = &x;print y;で、「yに'*'は指定できません。」のエラーになる。 [原因](1)の対応、y = &xのときに、yがポインタでなくなっていた。 [措置]_ex_conv_parm_opt()では、ポインタのときは、アドレス取得オプションでないときも、 そのまま、'S'形式で返すようにした。 また、'S'形式にするとき、ポインタは、そのままとした。 --> cl_gx_compile.c, cl_conv_parm.c <2023.01.31> (3)HOLDモードのエラーが出力されない [原因]エラーが蓄積されるのがTRYモードのときのみになっている。 [措置]HOLDモードのときもエラーが蓄積されるようにした。 --> cllog.c <2023.02.09> (4)arrayclr()でマップド配列をNULLパラメータでクリアしても設定済み要素数がゼロにならない。 [原因]pTBL<>NULLのときは、マップド配列の設定済み要素数を設定していない。 また、設定している値が、元の配列での設定済み要素数を設定している。 [措置]pTBL<>NULLのときも設定済み要素数を設定するようにし、また、設定値をゼロにした。 --> cl_gx_rep_set.c (5)arrayclr()でマップド配列をNULLパラメータでクリアしたとき、元の配列の設定済み要素が すべてなくなっても元の配列の設定済み要素数がゼロにならない。 [原因]pTBL<>NULLのときは、元の配列の設定済み要素数を元の配列上のマップド配列の開始位置-1に に設定しているが、それより前の要素が設定済みかどうかをチェックしていない。 [措置]上記、それより前の要素が設定済みかどうかをチェックし、すべてが未設定のときは、ゼロに するようにした。 --> cl_gx_rep_set.c <2023.02.10> (6)マップド配列Aで配列の要素数が定義されている場合に、要素がすべて未定義になっているとき、 その上位にマップされたマップド配列Bの要素に値が設定されると、マップド配列Aの設定済み 要素数が(マップド配列Bの設定済み最大要素位置-マップド配列Aオフセット位置)になる。 [原因]マップド配列Aの元の配列の設定済み最大要素位置がマップド配列Aの設定済み最大要素位置 より大きいとき、マップド配列Aの設定済み最大要素位置をその位置に更新している。 [措置]元の配列の設定済み最大要素位置がマップド配列Aの要素の最大位置を越えているときは、 マップド配列Aの設定済み最大要素位置を更新しないようにした。 --> cl_array.c(cl_get_array_index_tbl_ref) <2023.02.13> (7)abs(3i)が3iになる。 [原因]absでは、pInfoParm2=pInfoParm1の状態で、cl_cmpt_complex()が呼ばれる。 cl_cmpt_complex()では、iIMAGE1<>0, iIMAGE2<>0となり、absの結果にD_DATA_IMAGEを立てている。 [措置]absのときは、D_DATA_IMAGEを立てないようにした。 --> cl_cmpt_complex.c <2023.02.16> (8)mini環境で、undefを実行すると落ちる。 [原因]undefする変数のpi_aux[1]からpha_vnameを求める処理をforループで行っているが、 開始インデックスを3で回数が3のため、インデックスが0のLOCAL用に設定されず、未初期化の pha_vnameを使って落ちている。 [措置]ループの前にpha_vnameをNULLで初期化するようにし、ループの式を2から0まで回るようにした。 --> clprundef.c <2023.02.24> (9)exec_all_test list_test.txtを実行すると、test8で落ちる。 [原因]test8の前に実行したスクリプトでClass MATHのインスタンス情報が作成され残っている状態で、 test8でClass MATHのインスタンスを作成するときに既に存在しているのでそれを使って落ちている。 test8の前に作成されたインスタンスのtopleafは、そのスクリプトが終了した時点でFreeされている。 test8を実行したときに、残っているインスタンス情報のtopleafを使って落ちた。 [措置]インスタンス情報をpCLprocTableに登録するのを止めて、scrctに登録するようにした。 --> cl_class.c <2023.03.07> (10)GETWORD()関数で、SSPLのsp、wdlen、lenをバイト単位で入出力している。 [原因]不注意 [措置]文字単位で入出力するようにした。 --> cl_cmpt_string.c <2023.03.08> (11)for each x in ...; を繰り返し実行すると、x.Indexとx.Valueが未定義になる。 [原因]1回目を実行した際に、ループの中で参照しているxのobj0は、auto変数用の領域Objを 参照するようになる。ループを抜けた際にxを削除し、ループの初めにxを作成している。 したがって、Objのobj0が持っているアドレスが新しく取られたxのアドレスと一致する 保証がないにも係わらず、Objのobj0を使って未定義エラーとなった。 [措置]ループを開始する際に、Objのobj0をクリアするようにした。初回は、ループ内の変数は 未コンパイルなので、obj0が作られていないためクリア処理は行われない。 --> clprloop.c, cl_gx_compile.c <2023.03.19> (12)test_class.clを実行すると、2回目のNewで落ちる。 [原因]クラス変数を定義するために、生成したインスタンスのprocを使って、クラスを実行している。 procの開始時に、cl_process_proc()で、クラス変数用のobj0をクリアするために、 _proc_clear_var(proc)を呼んでいる。_proc_clear_var(proc)は、クラスのノードを順に調べて、 式で使っているobj0をクリアする。このとき、procの中の関数ノード中のobj0をクリアしようとして 落ちている。(proc内の関数のobj0は、その関数が持っている) [措置]procのleaf中の左側の関数ノードまたはprocノードは、調べないようにし、 右側の関数ノードまたはprocノードは、スキップするようにした。 --> cl_gx_compile.c <2023.04.16> (13)memory.logを出力する設定で、copy_obj_mini.clを実行すると、新しくなっていないファイルが コピーされる。 [原因]ファイルの日付を"yyyy/mm/dd hh:mi"で変換しているが、マイクロ秒が0クリアされていない。 また、日付比較で、maのマイクロ秒より後ろの値も比較している。 [措置]上記でマイクロ秒が0クリアされるようにした。また、日付比較では、maのマイクロ秒までを 比較するようにした。 --> akxcdate.c, cl_cmpt_comp.c <2023.04.16> (14)test_fact.clを2 0 1で実行すると、a[0] = n;でインデックスがありませんのエラーになる。 [原因]変数のobj0のエリアを式をコンパイルしたときにObj中に確保し、その先頭位置をその式の pbxObj構造体に記憶しておき、次に実行されたときには、コンパイルなしで、記憶した位置の obj0を使うようになっている。 再帰関数では、再帰に入る前に実行された式のobj0の位置は確定した状態で、再帰した関数は 実行され、逆に、再帰から戻った後の式は、再帰から戻る関数ですでに実行され、obj0の位置が 確定している。 obj0の位置は、その式が最初に実行された順番に依存した位置に取られている。したがって、 再帰関数では、コンパイル済みの式は、再帰に入る前または再帰から戻る前の関数で取られた 位置のobj0を使うことになる。 ところが同じ式が再帰に入る前の関数と戻る前の関数とで同じ順番で実行されるとは限らないので、 本来のその式用のobj0でないところを使いそこが設定済みだった場合には、objとobj0が正しい 対応にならなくなり、エラーとなった。 [措置]obj0を確保する先頭にその式のpbxObjのアドレスを入れておき、obj0を使うときに、今の式の pbxObjのアドレスと同じなら、そのまま使い、異なるときは、取り直すことにした。 --> cl_gx_exp_imd.c <2023.XX.XX> (15) [原因] [措置] -->