hideyosiが、ASKAをLinuxに移植しようともくろんであれやこれやと弄くりまわした時の記録です。こんな文章でもどなたかのご参考くらいにはなるかもしれないと思い、恥を忍んで公開しています。
えーと・・長過ぎるので、コメントはこのへんにでも。 (^^;)
・askaβ19(英語版)はMinGWでコンパイルできましたよ。使ったのは多分 "[OSASK 5194] gcc移植計画." このへんのMinGWです。 -- I.Tak. 2003-07-25 (金) 21:10:01
http://sourceforge.net/projects/mingw/
REM Set Your MINGW Directory Below REM This Setting is for the mingw ver. 2.0 SET MINGW=c:\mingw SET PATH=%MINGW%\bin;%MINGW%\lib\gcc-lib\mingw32\3.2;%PATH% SET GCC_EXEC_PREFIX=%MINGW%\lib\gcc-lib\mingw32\3.2 SET LIBRARY_PATH=%MINGW%\lib;%MINGW%\lib\gcc-lib\mingw32\3.2 SET C_INCLUDE_PATH=%MINGW%\include SET CPLUS_INCLUDE_PATH=%MINGW%\include\c++ SET OBJC_INCLUDE_PATH=%MINGW%\lib\gcc-lib\mingw32\3.2\include\objc make del gmake.pif
module.h: In member function `void Module::Release()': module.h:37: ISO C++ forbids casting to an array type `unsigned char[]' module.h:37: ISO C++ forbids casting to an array type `unsigned char[]' module.h:37: ISO C++ forbids casting to an array type `unsigned char[]' make: *** [main.o] Error 1
・なんか文法チェックが厳しくてはねられているみたいですね。C++へのオプションでチェックをゆるめてやるといいのかな? -- K 2003-07-26 (土) 14:00:17
・とりあえず問題のmodule.hの37行目の[]を*に変えたらaska.exeができるみたいです。UPXで圧縮しても115KBもありますが。でけえ!。まあ、動けばいいか。って動くかどうかも確かめてはいませんが。 -- K 2003-07-26 (土) 14:41:29
void Release(void){ DELETEPTR_SAFE((unsigned char[])lpMdlAdr); dwMdlSize=0; lpMdlPos=NULL; }
↓
void Release(void){ DELETEPTR_SAFE((unsigned char*)lpMdlAdr); dwMdlSize=0; lpMdlPos=NULL; }
・8月頭までは多少時間があるので、LinuxとWin95を使って、コンパイル実験等お手伝い出来るかと思います。 -- くーみん 2003-07-27 (日) 18:35:41
・今度はちゃんと落とせたました。早速、OSASKのソースの中のinit.askを使って試したところ、全て正しいファイルと全く同じものを出力しました。 -- 聖人 2003-07-27 (日) 22:29:40
さて、上記のような作業を通してちょっとだけものが解ったつもりになった私は、Linuxへの移植にチョッカイを出しました。
~/$ lha -x srcset05.lzh
~/$ cd aska/ensrc ~/aska/ensrc$
~/aska/ensrc$ make g++ -O2 -I. -c main.cpp In file included from parser.h:21, from main.cpp:1: module.h:11: io.h: ?????????????????????? make: *** [main.o] エラー 1 ~/aska/ensrc$
~/aska/ensrc$ gcc -O2 -c *.cpp In file included from generator.h:21, from generator.cpp:1: module.h:11: io.h: ?????????????????????? In file included from parser.h:21, ・ ・ ・ from table.cpp:1: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$
~/aska/ensrc$ ls *.cpp filepath.cpp main.cpp parser.cpp stringx.cpp textmodule.cpp generator.cpp module.cpp scanner.cpp table.cpp
~/aska/ensrc$ ls *.o filepath.o stringx.o textmodule.o ~/aska/ensrc$
~/aska/ensrc$ gcc -O2 -c scanner.cpp In file included from scanner.h:21, from scanner.cpp:1: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$ ~/aska/ensrc$ gcc -O2 -c module.cpp In file included from module.cpp:2: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$ ~/aska/ensrc$ gcc -O2 -c parser.cpp In file included from parser.h:21, from parser.cpp:2: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$ ~/aska/ensrc$ gcc -O2 -c generator.cpp In file included from generator.h:21, from generator.cpp:1: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$ ~/aska/ensrc$ gcc -O2 -c module.cpp In file included from module.cpp:2: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$ ~/aska/ensrc$ gcc -O2 -c main.cpp In file included from parser.h:21, from main.cpp:1: module.h:11: io.h: ?????????????????????? ~/aska/ensrc$
:mosule.h
・ ・ #include <stdio.h> #include <stdlib.h> #include <io.h> #include <iostream> ・ ・
~/aska/ensrc$ gcc -O2 -c scanner.cpp In file included from scanner.h:20, from scanner.cpp:1: macro.h:24: parse error before `if' macro.h:24: stray '\' in program macro.h:25: stray '\' in program ・ ・ ・ scanner.cpp: In method `enum Token Scanner::PeekToken()': scanner.cpp:56: stray '\' in program ~/aska/ensrc$
// ポインタが非NULLならばdeleteするマクロ #define DELETE_SAFE(var) \ if (var != NULL) {\ delete var;\ var = NULL;\ }
// ポインタが非NULLならばdeleteするマクロ #define DELETE_SAFE(var) if (var != NULL) { delete var; var = NULL; }
// クラスのポインタ等をdeleteするマクロ #define DELETEPTR_SAFE(var) \ if (var != NULL) {\ delete [] var;\ var = NULL;\
// クラスのポインタ等をdeleteするマクロ #define DELETEPTR_SAFE(var) if (var != NULL) { delete [] var; var = NULL; }
~/aska/ensrc$ gcc -O2 -c parser.cpp parser.cpp: In method `long int Parser::LocalAddress(Parameter &)': parser.cpp:113: implicit declaration of function `int ltoa(...)' parser.cpp: In method `long int Parser::Selector(Parameter &, LabelList *)':
Error("Cannot use \"&\" for register, array, and immediate perand"); return 5; } param.disp += ltoa(selparam.ndisp + label->nLocalAddress, buf, 10); return 0; }
Error("Cannot use \"&\" for register, array, and immediate operand"); return 5; } param.disp += sprintf(buf,"%ld",selparam.ndisp + label->nLocalAddress); return 0;
if(param.ndisp != 0){ if(param.disp == ""){ param.disp += ltoa(param.ndisp, buf, 10); }else{ param.disp += dummy + "+" + ltoa(param.ndisp, buf, 10); } param.ndisp = 0;
↓
if(Selector2(param) != 0) return 1; if(param.ndisp != 0){ if(param.disp == ""){ param.disp += sprintf(buf,"%ld",param.ndisp); }else{ param.disp += dummy + "+" + sprintf(buf,"%ld",param.ndisp); } param.ndisp = 0;
~/aska/ensrc$ gcc -O2 -c parser.cpp parser.cpp: In method `long int Parser::Selector(Parameter &, LabelList *)': parser.cpp:151: no match for `basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> > + int' ~/aska/ensrc$
sprintf(buf,"%ld",param.ndisp);param.disp += dummy + "+" + buf;
#define ltoa(n,b,l) (spfintf(b,"%ld",n), b)
~/aska/ensrc$ gcc -O2 -c module.cpp module.cpp: In method `long int Module::ReadFile(string &)': module.cpp:26: implicit declaration of function `int filelength(...)'
#include <string.h> #include "module.h" //現在ではディレクトリの検索などはしていないので、単純に""や<>をはずすだけ string Module::MakeFullPath(string& p){ string str = p.substr(0, 0); if(str == "\"" || str == "\'" || str == "<"){ str = p.substr(1, str.size()-1); }else{ str = p.substr();
↓
#include <string.h> #include "module.h" #include <sys/stat.h> int filelength (int fd) { struct stat st; if (fstat (fd, &st) == -1) { exit (1); } return st.st_size; } //現在ではディレクトリの検索などはしていないので、単純に""や<>をはずすだけ string Module::MakeFullPath(string& p){ string str = p.substr(0, 0); if(str == "\"" || str == "\'" || str == "<"){ str = p.substr(1, str.size()-1);
~/aska/ensrc$ gcc -O2 -c generator.cpp generator.cpp: In method `void Generator::Param2LPSTR(char *, Parameter &)': generator.cpp:45: implicit declaration of function `int ltoa(...)' generator.cpp:45: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast ・ ・ ~/aska/ensrc$
45行目 strcat(buf, ltoa(param.ndisp, buf2, 10)); 68行目 strcat(buf, ltoa(param.scale, buf2, 10)); 79行目 strcat(buf, ltoa(param.ndisp, buf2, 10));
↓
45行目 strcat(buf, sprintf(buf2,"%ld",param.ndisp)); 68行目 strcat(buf, sprintf(buf2,"%ld",param.ndisp)); 79行目 strcat(buf, sprintf(buf2,"%ld",param.ndisp));
~/aska/ensrc$ gcc -O2 -c generator.cpp generator.cpp: In method `void Generator::Param2LPSTR(char *, Parameter &)': generator.cpp:45: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast generator.cpp:68: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast generator.cpp:79: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast
45行目 sprintf(buf2,"%ld",param.ndisp);strcat(buf,buf2 ); 68行目 sprintf(buf2,"%ld",param.ndisp);strcat(buf,buf2 ); 79行目 sprintf(buf2,"%ld",param.ndisp);strcat(buf,buf2 );
~/aska/ensrc$ gcc -O2 -c generator.cpp generator.cpp: In method `void Generator::RegistMul(Parameter &, Parameter &)': generator.cpp:510: implicit declaration of function `int itoa(...)' generator.cpp:510: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast generator.cpp: In method `void Generator::RegistDiv(Parameter &, Parameter &)': generator.cpp:554: passing `int' to argument 2 of `strcat(char *, const char *)' lacks a cast
510行目 strcpy(buf, buf1); strcat(buf, ","); strcat(buf, itoa(x, buf2, 10)); 554行目 strcat(buf, ","); strcat(buf, itoa(x, buf1, 10)); 722行目 OutputMASM("#local", "equ", itoa(sysvarlocalvalue, buf, 10), "");
↓
510行目 strcpy(buf, buf1); strcat(buf, ","); sprintf(buf2,"%d",x);strcat(buf, buf2); 554行目 strcat(buf, ","); sprintf(buf1,"%d",x);strcat(buf, buf1); 722行目 sprintf(buf,"%d",sysvarlocalvalue);OutputMASM("#local", "equ", buf, "");
~/aska/ensrc$ gcc -O2 -c table.cpp ~/aska/ensrc$
~/aska/ensrc$ gcc -O2 -c main.cpp ~/aska/ensrc$
・ ・ GC = gcc CFLAGS = -O2 -I. CPPFLAGS = PGNAME = aska.exe # # SRC Directory ・ ・
↓
・ ・ GC = gcc CFLAGS = -O2 -I. CPPFLAGS = PGNAME = aska # # SRC Directory ・ ・
~/aska/ensrc$ make clean rm -f .depend a.out core aska rm -f *.o *~ ~/aska/ensrc$ make g++ -O2 -I. -c main.cpp g++ -O2 -I. -c parser.cpp g++ -O2 -I. -c module.cpp g++ -O2 -I. -c generator.cpp g++ -O2 -I. -c filepath.cpp g++ -O2 -I. -c scanner.cpp g++ -O2 -I. -c stringx.cpp g++ -O2 -I. -c table.cpp g++ -O2 -I. -c textmodule.cpp g++ -o aska main.o parser.o module.o generator.o filepath.o scanner.o stringx.o table.o textmodule.o strip aska ~/aska/ensrc$
・
・
・
・
う・・・うごいたぁ・・・・・
・検証作業完了!。すくなくとも、tolset05.lzh に付属の hello0.ask と hellok0.ask に関しては、改行コード以外はまったく同一のファイルを吐き出しました。(うわぁぁぁ!!) -- hideyosi 2003-07-28 (月) 14:02:13
・パッチが完成しました。動作実験を行ってくれる勇者は名乗られよ!!。メールで送りますね。もすこし検証してもらって問題なければ、いよいよ一般公開じゃぁ~! ━━━━(゚∀゚)━━━━!! -- hideyosi 2003-07-28 (月) 14:21:43
・パッチ希望! 自分でやったら (変にマクロを使ったせいか) 失敗しました…… -- I.Tak. 2003-07-28 (月) 14:31:15
・g++ 2.95.3 でコンパイルしたら, 入力をまるで無視するバイナリができました(T^T ↓と同じ症状です。ちなみにDebian(@学校の端末)でやってます。 -- I.Tak. 2003-07-28 (月) 16:59:02
・うあぁぁぁ・・・(T∀T) 了解です。ちとこちらでも検証してみます。 -- hideyosi 2003-07-28 (月) 17:13:26
・おっかしいですねぇ・・・。うちのデビでは、ちゃんと稼動しますぅ・・。ウチのg++は、2.95.4(今回導入)なんですが・・・。念のため、うちのデビのパッケージリストを更新しましたので、見てみてください。(へんだなぁ・・・・???) -- hideyosi 2003-07-28 (月) 17:39:58
・RHL9,compat-gcc-7.3-2.96.118で、CCにgcc296,LDにg++296を指定しました何送っても無視されました。。。(鬱 -- 2003-07-29 (火) 18:09:35
・ご報告、どうもありがとうございます。ええと、すいません、もう少し詳しくお聞かせねがえませんか。コンパイルは通ったのでしょうか。それとも、出来上がったASKAがおかしいのでしょうか。またもしおかしいのでしたら、なにかメッセージ等出ていませんか。お手数でしょうが、是非お知らせいただけるとありがたいです。どうぞよろしくお願いいたします。 -- hideyosi 2003-07-29 (火) 18:21:30
・コンパイルはできても、できあがったASKAが、入出力をしません -- 2003-07-29 (火) 20:12:13
・新パッチ動きました (@学校)。hellok0.askなどは処理できました。しかしどうやらASKAはDOSタイプの改行コード(CR+LF)に依存しているようで, ほかのUNIXやMACの改行コードではうんともすんとも言いませんでした。あと最後の行に改行が無いとエラー扱いにされます。オリジナルもこうでしたっけ? (Windowsでしか動かなかったので試したことが無い) -- I.Tak. 2003-07-31 (木) 16:37:27
HRESULT Module::ReadLine(LPSTR buf){ int i; if(lpMdlPos == NULL) return 3; if(lpMdlPos >= (LPSTR)lpMdlAdr + dwMdlSize) return 1; for(i = 0; i < 1023; i++){ if(*lpMdlPos == 0x0D && *(lpMdlPos+1) == 0x0A){ *buf = '\0'; lpMdlPos += 2; return 0; // 1行終了 } *(buf++) = *(lpMdlPos++); } *buf = '\0'; return 2; // バッファあふれ }
HRESULT Module::ReadLine(LPSTR buf){ int i; if(lpMdlPos == NULL) return 3; if(lpMdlPos >= (LPSTR)lpMdlAdr + dwMdlSize) return 1; for(i = 0; i < 1023; i++){ // if(*lpMdlPos == 0x0D && *(lpMdlPos+1) == 0x0A){ if(*lpMdlPos == 0x0D && *(lpMdlPos+1) == 0x0A){ *buf = '\0'; lpMdlPos += 2; return 0; // 1行終了(DOS) } if(*lpMdlPos == 0x0A || *lpMdlPos == 0x0D){ *buf = '\0'; lpMdlPos += 1; return 0; // 1行終了(UNIX or MAC) } *(buf++) = *(lpMdlPos++); } *buf = '\0'; return 2; // バッファあふれ }
・動きました。簡単なソースを処理させましたが, 三種の改行コードをみな認識できてます。しかし, 改行コードなしの行でソースが終わる場合誤動作します (運がいいとしませんが)。つうわけで(^^; 適当に(オリジナルに対する) パッチをまとめつつ修正してみました。http://user.ecc.u-tokyo.ac.jp/~g240845/osask/lzh/aska_test-0.0.2.patch.gz 使い方はファイルの先頭に書いてあります。 -- I.Tak. 2003-08-01 (金) 11:12:07