.g01アプリはコンパイルの流れが今までと違う。こういう流れになる・・・はず。(たしか)
hijk sjisconv sjis in:ターゲット.c out:ターゲット.ca 28GOcc1 -I../z_tools/guigui01/ -Os -Wall -quiet -o ターゲット.gas ターゲット.ca hijk gas2nask -a D:4 -A in:ターゲット.gas out:ターゲット.nas hijk Nasuka in:ターゲット.nas out:ターゲット.obj hijk obj2bim rul:../z_tools/guigui01/guigui01.rul out:ターゲット.bim stack:0 map:ターゲット.map \ rlm:ターゲット.rlm ../z_tools/guigui01/g01libc0.lib ターゲット.obj \ ../z_tools/guigui01/g01libc1.lib hijk bim2g01 ターゲット.bim ターゲット.org ターゲット.rlm hijk tekmin0 ターゲット.org ターゲット.nho bim2bin -osacmp in:ターゲット.nho out:ターゲット.nh5 hijk tekmin1 -efg01-noadc ターゲット.nh5 ターゲット.g01
まずはとにかく、Makefileをこう書き換えて、いきなりメイクしてみるwww
include ../z_tools/command.txt TARGET = osalink1 MODE = g01 OBJS = $(TARGET).obj INCPATH = ../z_tools/guigui01/ include ../z_tools/com_mak.txt
osalink1.ca: In function `G01Main': osalink1.ca:51: warning: implicit declaration of function `strcmp'
まずはこれ。string.hをインクルードすればOK。
osalink1.ca:52: warning: implicit declaration of function `fprintf'
あっれぇ?guigui01には、fprintf関数がない・・・ぞ?
うーん困ったな。解説書も見当たらないや・・・・しょうがないのでgas2naskとかsjisconvがどうやってるのか見てみよう・・・
jg01_fwrite1f_5 ←こういう命令で読み書きをしてるのが解ってきたぞ。
ここ[4]に手がかりがあったがすこし違う。もしかして新しくなってる?
fprintfって、ファイルに書き込む命令でそ? こっち[6]でとりあえず読み込みがわかったので、まずは書くのは後回し(コメントアウトとかで)して、osalink1.optとかを読み込んでみよう
まずはこういう手の表記。
FILE *fp0, *fp1;
.g01ではスロットというものを使ってファイルハンドルと同じ操作をするので、これは撤廃。(当然fpとかの表記もコメントアウト)
// OPTIONFILEの読み込みと各ファイルのサイズ取得 fp0 = fopen(optfile, "r"); if (fp0 == NULL) { fprintf(stderr, "Can't open \"%s\".\n", optfile); return 1; }
ここでosalink1.optを開いてるよね。これを・・・・
// OPTIONFILEの読み込みと各ファイルのサイズ取得 char *buffer1 = g01_bss1a1; jg01_fopen(1, 4, optfile); jg01_fread0_4(2 * 1024 * 1024, buffer1); if (strlen(buffer1) == 0) { g01_putstr0("Can't open optfile\n"); return 1; }
こういうことでいいのかな・・・
ちょっと面白いこと発見。このosalink1は、元々内部コードで2MBのバッファを確保してるんだけど、これを文字列配列でやってたのよね。で、これがあると、G01Mainがまったく動かなくなっちゃうらしいww。ちゃんとmallocやg01_bss1a1で確保すると大丈夫だというwww
g01のapiでは、一行読み込みはない。すでにbuffer1内に全部入っちゃってる。つーことは・・・・
改行コードを元に、自分で配列とかを作って割ってやらないといけない・・・のかな。例えば・・・
//まずは改行コードを一旦統一する for ( i = 0; i < strlen(buffer1); i++){ //とりあえずLFに統一するか・・・ if (buffer1[i] == 0x0D) buffer1[i] = 0x0A; //これで、CRが全部LFに置換されるはず。 } //先頭にある邪魔なLFなどを排除するため、開始地点を探っておく int stppoint; stppoint = 0; for ( i =0; i < strlen(buffer1); i++){ if ( buffer1[i] != 0x0A ){ stppoint = i; break; } } //これでもし先頭にLFがあっても全て飛ばした位置から開始できる //新しい配列変数を確保する。 int ii2; ii2 = 0; int lfs; lfs = 0; unsigned char files[strlen(buffer1)+1]; for ( i = stppoint; i < strlen(buffer1); i++){ if ( buffer1[i] == 0x0A && buffer1[i-1] == 0x0A ){ // 連続したLFだったらシカトして進める。 } else { if ( buffer1[i] == 0x0A ){ files[ii2] = 0; lfs++; } else { files[ii2] = buffer1[i]; } ii2++; // LFを終端コードに置換 } } //最後に終端コードを打っておく files[ii2+1] = 0; //これで、0によって区切られた配列になったはず。 //files配列内の、0の位置を記憶する配列を用意する。 //厳密には0の前。行頭というべきか・・・ int zeropoint[lfs + 1]; //↑の処理で先頭は必ず行頭になってるはずなので・・・ zeropoint[0]=0; int i3; i3 = 1; for (i = 1; i < ii2 +1; i++){ if (files[i] != 0 && files[i-1] == 0){ //ここが行頭になるはず。位置を記憶 zeropoint[i3] = i; i3++; } } //これで、有効な行数はi3個。lfpointが行の先頭になっているはず。 for ( i = 0; i < i3; i++){ g01_putstr0(files + zeropoint[i] ); g01_putstr0("\n"); }
これでどおぉぉぉだあぁぁぁ!! コンツクショー!!! (レベル低いですかそうですか・・・orz)
コマンドライン引数のファイルパスタイプの「規定値」がどうしてもわからん。しょうがないので、オプションファイルの指定は文字列型で受け取ってお茶を濁そう・・・
(This host) = http://osask.net