ページへ戻る
印刷
hideyosi/OLD/ASKAをLinuxに移植してみた記録
をテンプレートにして作成 ::
OSASK計画
osaskwiki
:hideyosi/OLD/ASKAをLinuxに移植してみた記録 をテンプレートにして作成
開始行:
TITLE:x
*これはなにか?
hideyosiが、ASKAをLinuxに移植しようともくろんであれやこれ...
-すこし読んでいただければすぐにわかると思いますが、私はC...
-この文章は、''OSASKのWiki''にはあまりふさわしいとは思え...
----
えーと・・長過ぎるので、コメントはこのへんにでも。 (^^;)
----
*Linuxに移植してみよう! でも、そのまえに・・・
-まずは、Windowsでコンパイルしてみる。
--そもそも、私はCとかがよくわからない。また、Linuxだって...
--そんなわけで、まずは、''ソース''と''コンパイラ''が必要...
-コンパイラの調達
--Windows上でASKAのようなC++のソースをコンパイルするのに...
--幸いなことに、私はこれを使える環境にあった。しかし、こ...
COLOR(#009900){・askaβ19(英語版)はMinGWでコンパイルできま...
--そんなことをつぶやいていると、英雄I.Takさんからアドバイ...
--MinGWについて調べてみた。おぉ!。これは、ヨースルに、Li...
http://sourceforge.net/projects/mingw/
--ちょっとわかりにくかったが、このページ内の、''DOWNLOAD'...
--あれれ? MinGWは何種類かバージョンがある。I.Takさんのア...
--そんなわけなので、両方とも入手してみた。MinGW-1.1.tar.g...
--さて、まずはこれらをセットアップする。2.0は簡単だ。exe...
-ソースの入手。しかし、落とし穴が!
--ソースを入手すべく、今原さんのページへ。aska10b18.lzh ...
--解凍すると、中には出来上がっているASKAとソースが入って...
--・・・・・・あれ????
--実は、大変な勘違いをしていたことが分かった。ASKAの最新...
--そんなわけで、慌てて調べてみると、ASKAの最新版は、[[OSA...
--さっそくダウンロードしなおして、C:\aska_m にコピーしな...
-コンパイルしてみる。''まずは、MSVC++6''
--これは、極めて簡単だった。ASKAのソースの中に、ASKA.dws ...
--あとは単にビルドするだけ。debug というディレクトリが出...
-コンパイルしてみる。''MinGW1.1 の場合''
--ASKAのソースの中に、gmake.bat というバッチファイルがあ...
--・・・あかん・・・。なんでだろう????
--だいぶなやまされたが、へんなことに気付いた。今現在、私...
--コンパイル成功! aska.exe が作られた。
-コンパイルしてみる。''MinGW2.0 の場合''
--さて、こんどはMinGW2.0だ。↑ のパターンで考えると、おそ...
--また、なぜか MinGW2.0 には、 makeコマンドがない。探して...
--また、よくほかのディレクトリを見てみると、1.1とは微妙に...
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;%PA...
SET GCC_EXEC_PREFIX=%MINGW%\lib\gcc-lib\mingw32\3.2
SET LIBRARY_PATH=%MINGW%\lib;%MINGW%\lib\gcc-lib\mingw32...
SET C_INCLUDE_PATH=%MINGW%\include
SET CPLUS_INCLUDE_PATH=%MINGW%\include\c++
SET OBJC_INCLUDE_PATH=%MINGW%\lib\gcc-lib\mingw32\3.2\in...
make
del gmake.pif
--そして、忘れてはいけないのがクリーン作業。つまり、さっ...
--さて、ではコンパイル。 gmake.bat を実行する。
module.h: In member function `void Module::Release()':
module.h:37: ISO C++ forbids casting to an array type `u...
module.h:37: ISO C++ forbids casting to an array type `u...
module.h:37: ISO C++ forbids casting to an array type `u...
make: *** [main.o] Error 1
--・・・・あれぇ???。こんなエラーが出た。
--これは、C++コンパイラのエラーだ。うーん・・。どういうこ...
COLOR(#009900){・なんか文法チェックが厳しくてはねられてい...
COLOR(#009900){・とりあえず問題のmodule.hの37行目の[]を*...
--Kタンから、こんなアドバイスが!。有難い!さっそく実践。
void Release(void){ DELETEPTR_SAFE((unsigned char[])lpM...
''↓''
void Release(void){ DELETEPTR_SAFE((unsigned char*)lpMd...
--この変更で、無事、コンパイルに成功しました。
---あとで教えてもらったことなんですが、MinGW1.0はgcc2.95....
-検証と考察
COLOR(#009900){・8月頭までは多少時間があるので、LinuxとWi...
COLOR(#009900){・今度はちゃんと落とせたました。早速、OSAS...
--こうして出来上がった3つのASKA。動作はみなさんが手伝って...
--問題としては、出来上がったASKAが軒並み大きいということ...
---MSVC++6: 99kbyte
---MinGW1.1: 79kbyte
---MinGW2.0: 115kbyte
--うーん・・・どうなんでしょう。とりあえずはこれでOKとし...
*ASKAをLinuxに移植する試み
さて、上記のような作業を通してちょっとだけものが解ったつ...
-まずは、下準備ね。
--getした''srcset05.lzh''をLinux上で解凍する。これは、
~/$ lha -x srcset05.lzh
--で楽々。カレントも移っておこう。
~/$ cd aska/ensrc
~/aska/ensrc$
-一応。 ''makefile'' を、 ''Makefile''にリネームしておく。
***俺は乱暴ものだ!!
-そういうわけで、とりあえず下準備はOKなのだ。さて、どうす...
~/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$
-・・・そんなわけで、いきなりエラーが出ました。まあ、当然...
-さて、ここでちと考えて見る。C とかって、ソースファイルが...
-この場合、自動的にやってくれる make だと、エラーが出た時...
~/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 tex...
generator.cpp module.cpp scanner.cpp table.cpp
-ふむふむ。cppファイルは全部で9個ある。
~/aska/ensrc$ ls *.o
filepath.o stringx.o textmodule.o
~/aska/ensrc$
-・・・おぉぉ!。objファイルがいつのまにか3個出来ているぞ...
***残りの6個のcppファイルをコンパイルテスト
--まず、ここいらあたりから。さっそく単品コンパイル。
~/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>
・
・
-うーん。この #include <io.h> に問題があるみたい。どれど...
-あっれぇ??。コンパイルが成功したWindowsのMinGWのほうを...
-LinuxBOXのHDの中をあっちこっち探してみると、やっと見つけ...
-気になったので、おのおのの中身とMinGWのヤツを見比べてみ...
-・・・・あっれぇ???。C言語出来ない私だけど、なんか、...
-判明した。なんと、これ、たまたま同じ名前っつーだけで、ぜ...
-・・・必殺技!!! コメントアウトじゃぁ~!!! (と...
-俺は乱暴者だぁ~・・・
***さて、手始めに、 scanner.cpp あたりから。
-ではでは。さっそくコンパイルしてみる。
~/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$
-ふーん・・・。scanner.cpp ではなくて、インクルードしてい...
// ポインタが非NULLならばdeleteするマクロ
#define DELETE_SAFE(var) \
if (var != NULL) {\
delete var;\
var = NULL;\
}
-ふむ。ここいらへん、どうも行が長いので、¥ で割っている...
// ポインタが非NULLならばdeleteするマクロ
#define DELETE_SAFE(var) if (var != NULL) { delete var; ...
-これがなんと、大当たり!!。この部分ではエラーが出なくな...
-でも、こんどが別の部分で同じようなエラー文が。
-あららら?。いま直した部分のすぐ下に、ほとんど同じような...
// クラスのポインタ等をdeleteするマクロ
#define DELETEPTR_SAFE(var) \
if (var != NULL) {\
delete [] var;\
var = NULL;\
-よし。ここも同じく一行にしてみよう。
// クラスのポインタ等をdeleteするマクロ
#define DELETEPTR_SAFE(var) if (var != NULL) { delete []...
-おぉ!無事、コンパイル終了だ! また野望に一歩近づいた!!
***おっしゃぁ! 次は、parser.cpp じゃ!
-さっそくコンパイル。
~/aska/ensrc$ gcc -O2 -c parser.cpp
parser.cpp: In method `long int Parser::LocalAddress(Par...
parser.cpp:113: implicit declaration of function `int lt...
parser.cpp: In method `long int Parser::Selector(Paramet...
-うーん。このエラーを調べてみると、「そんな関数、シラネー...
-うひゃぁ!。えらいことだ。LinuxのGCCでは、「そんな関数、...
-捨てる神あれば拾う神ありで、sprintf関数で代用できるつー...
Error("Cannot use \"&\" for register, ar...
return 5;
}
param.disp += ltoa(selparam.ndisp + label->nLoca...
return 0;
}
-を、以下のように書き換え。
Error("Cannot use \"&\" for register, ar...
return 5;
}
param.disp += sprintf(buf,"%ld",selparam.ndisp + ...
return 0;
-念のため、ほかにこの関数がないか検索・・・。あったあった...
if(param.ndisp != 0){
if(param.disp == ""){
param.disp += ltoa(param.ndisp, b...
}else{
param.disp += dummy + "+" + ltoa(...
}
param.ndisp = 0;
''↓''
if(Selector2(param) != 0) return 1;
if(param.ndisp != 0){
if(param.disp == ""){
param.disp += sprintf(buf,"%ld",p...
}else{
param.disp += dummy + "+" + sprin...
}
param.ndisp = 0;
-さーて、これでいいはず。再びコンパイル。
~/aska/ensrc$ gcc -O2 -c parser.cpp
parser.cpp: In method `long int Parser::Selector(Paramet...
parser.cpp:151: no match for `basic_string<char,string_c...
~/aska/ensrc$
-おんやぁ~?。なんだろう。このエラー。
-調べてみると、どうも、変数の型式が違うと怒っているらしい...
-結局、151行目を以下のようにすることで解決。これでいいの...
sprintf(buf,"%ld",param.ndisp);param.disp += du...
-まあ、とりあえず、これでよしということにしておこう。(ど...
-ltoaは
#define ltoa(n,b,l) (spfintf(b,"%ld",n), b)
-とマクロ定義にすればパッチも小さくなってよいと思われ。(I...
***module.cpp いってみようか!
-コンパイルすると、
~/aska/ensrc$ gcc -O2 -c module.cpp
module.cpp: In method `long int Module::ReadFile(string ...
module.cpp:26: implicit declaration of function `int fil...
-っとまあ、こういうエラーがでる。たしか、このパターンは、...
-調べてみると、どうもこいつも、MinGWに特有の関数らしい。...
-いやぁ~。あるもんですな。そんなわけで、以下のブロックを...
#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);
-なんと、これだけでOKでしたぁ。 (ルンルン♪)
---I.Takさん、感謝~。
--勝手に修正して, 元の部分を外に出しておいたのはやはりま...
---うわぁぁ! 再度感謝。勘違いして元に戻してしまい、いま...
***generator.cpp いくぞー!
-コンパイル。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::Param2LPSTR(ch...
generator.cpp:45: implicit declaration of function `int ...
generator.cpp:45: passing `int' to argument 2 of `strcat...
・
・
~/aska/ensrc$
-ふーん。なるほど。一杯出てきたけど、これは parser.cpp の...
-えーと、どれどれ、いっぱいあるなぁ・・・。45・68・79行目...
45行目 strcat(buf, ltoa(param.ndis...
68行目 strcat(buf, ltoa(param.scal...
79行目 strcat(buf, ltoa(param.ndis...
''↓''
45行目 strcat(buf, sprintf(buf2,"%...
68行目 strcat(buf, sprintf(buf2,"%...
79行目 strcat(buf, sprintf(buf2,"%...
-よーし。これでいいかな。コンパイル。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::Param2LPSTR(ch...
generator.cpp:45: passing `int' to argument 2 of `strcat...
generator.cpp:68: passing `int' to argument 2 of `strcat...
generator.cpp:79: passing `int' to argument 2 of `strcat...
-うにゃぁ?あれれ、なんじゃこりゃ?。うーん???。なんか、...
-そんなわけで、こういう風に変更。(・・・だんだん自身がな...
45行目 sprintf(buf2,"%ld",param.nd...
68行目 sprintf(buf2,"%ld",param.nd...
79行目 sprintf(buf2,"%ld",param.nd...
-さーて、こんどこそ大丈夫かな。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::RegistMul(Para...
generator.cpp:510: implicit declaration of function `int...
generator.cpp:510: passing `int' to argument 2 of `strca...
generator.cpp: In method `void Generator::RegistDiv(Para...
generator.cpp:554: passing `int' to argument 2 of `strca...
-あらら?。今直した所はパスしているみたいだけど、別のとこ...
-調べてみたら、これも3箇所もあった。一気に修正。ただし、...
510行目 strcpy(buf, buf1); strcat(buf, ","); str...
554行目 strcat(buf, ","); strcat(buf, itoa(x, bu...
722行目 OutputMASM("#local", "equ", itoa(sysvarl...
''↓''
510行目 strcpy(buf, buf1); strcat(buf, ","); spr...
554行目 strcat(buf, ","); sprintf(buf1,"%d",x);s...
722行目 sprintf(buf,"%d",sysvarlocalvalue);Outpu...
-いよーし!!。これでコンパイル、完了!!!
***うおぉぉ! table.cpp じゃ!
-さーて・・・こいつはどこ修正するのかなぁ・・・
~/aska/ensrc$ gcc -O2 -c table.cpp
~/aska/ensrc$
-・・・・あれ? 通っちゃった・・・ ひえぇーー!!
*** main.cpp キタ━━━━(゚∀゚)━━━━ッ!!
-いくぞ!! ラスト!
~/aska/ensrc$ gcc -O2 -c main.cpp
~/aska/ensrc$
-・・・・逝ってくれましたぁ・・・
-え?つーことは???。全コンパイル、いけるのか! いっけ...
***ASKAちゃん、大地に立つ!
-えーと・・・。そんなわけで、これでとりあえず、LinuxでASK...
・
・
GC = gcc
CFLAGS = -O2 -I.
CPPFLAGS =
PGNAME = aska.exe
#
# SRC Directory
・
・
''↓''
・
・
GC = gcc
CFLAGS = -O2 -I.
CPPFLAGS =
PGNAME = aska
#
# SRC Directory
・
・
-さて、それでは一旦クリーンして、いよいよmake。
~/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 filepat...
strip aska
~/aska/ensrc$
-うおぉぉ!! ついに、ついにASKA、完成じゃぁぁぁぁぁぁ!...
-ASKAか・・・・ なにもかもがみななつかすい・・・・・(T∀T)
*ASKA、新たなる旅立ち
-さてさて、そーゆーわけで、ついにASKAがコンパイルできまし...
-そんなわけで、とりあえず tolset05.lzh に付属の hello0.as...
・
・
・
・
SIZE(25){う・・・うごいたぁ・・・・・}
*ASKA 発動編----
-そんなわけでコンパイルに成功し、またとりあえず簡単な動作...
-そんな折、T.Takさんからもコンパイル成功の一報が入る。
----
*一応報告(I.Tak.)
-LinuxでASKAをコンパイルだけすることに成功しました。
--module.h(多分): #include <io.h> を #include <sys/io.h> ...
--module.cpp: filelength関数 (メソッド?) を自作 (fstat関...
--generator.cpp, parser.cpp: ltoa, itoa 関数を自作
--main.cpp: usageに入っている ":" を ": " に置換(^^;
---g++ -O2 -c *.cpp
---gcc -O2 -c *.c #Cソースを自作したので
---g++ -o aska *.o
-これでバイナリができます。%%でもscanner.PeekTokenがすぐ...
-ちなみにコンパイラは 2.95.4。3.0を使ったら unsigned char...
----
-うーん、そんなわけなので、私が作った版のパッチを作成して...
COLOR(#009900){・検証作業完了!。すくなくとも、tolset05.l...
COLOR(#009900){・パッチが完成しました。動作実験を行ってく...
COLOR(#009900){・パッチ希望! 自分でやったら (変にマクロを...
COLOR(#009900){・g++ 2.95.3 でコンパイルしたら, 入力をま...
COLOR(#009900){・うあぁぁぁ・・・(T∀T) 了解です。ちと...
COLOR(#009900){・おっかしいですねぇ・・・。うちのデビでは...
COLOR(#009900){・RHL9,compat-gcc-7.3-2.96.118で、CCにgcc2...
COLOR(#009900){・ご報告、どうもありがとうございます。ええ...
COLOR(#009900){・コンパイルはできても、できあがったASKAが...
-うーん・・・。何人かの方から、コンパイルは出来ても動作し...
-こまりはてた私は、ヤケクソであっちこっちにデバッグ用の p...
COLOR(#009900){・新パッチ動きました (@学校)。hellok0.ask...
-I.Takさんからとんでもないヒントが飛び込んできた。もしや...
-どうやら原因はこれ臭い。そんなわけで、さっそく改行コード...
-見つけた!。module.cpp の最後のほう。
HRESULT Module::ReadLine(LPSTR buf){
int i;
if(lpMdlPos == NULL) return 3;
if(lpMdlPos >= (LPSTR)lpMdlAdr + dwMdlSize) retu...
for(i = 0; i < 1023; i++){
if(*lpMdlPos == 0x0D && *(lpMdlPos+1) ==...
*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) retu...
for(i = 0; i < 1023; i++){
// if(*lpMdlPos == 0x0D && *(lpMdlPo...
if(*lpMdlPos == 0x0D && *(lpMdlPos+1) ==...
*buf = '\0';
lpMdlPos += 2;
return 0; // 1行終了(DOS)
}
if(*lpMdlPos == 0x0A || *lpMdlPos == 0x0...
*buf = '\0';
lpMdlPos += 1;
return 0; // 1行終了(UNIX...
}
*(buf++) = *(lpMdlPos++);
}
*buf = '\0';
return 2; // バッファあふれ
}
-こんな変更をしたパッチを作り、再びテスト隊にみなさんに実...
COLOR(#009900){・動きました。簡単なソースを処理させました...
-キタ━━━━(゚∀゚)━━━━ッ!!
-I.Takさんから動作確認がきました。しかも、最後まで残って...
-さらにすごいオマケがついている。私がこれまで当てずっぽう...
*ASKA めぐり合い宇宙編
-これで、ほぼASKAをLinuxに移植することは成功だと思う。(...
-I.Takさんが最後に清書してくれた版を、ASKAのページにて公...
-この検証が終われば、I.Takさんが書いてくれたhistoryやらな...
終了行:
TITLE:x
*これはなにか?
hideyosiが、ASKAをLinuxに移植しようともくろんであれやこれ...
-すこし読んでいただければすぐにわかると思いますが、私はC...
-この文章は、''OSASKのWiki''にはあまりふさわしいとは思え...
----
えーと・・長過ぎるので、コメントはこのへんにでも。 (^^;)
----
*Linuxに移植してみよう! でも、そのまえに・・・
-まずは、Windowsでコンパイルしてみる。
--そもそも、私はCとかがよくわからない。また、Linuxだって...
--そんなわけで、まずは、''ソース''と''コンパイラ''が必要...
-コンパイラの調達
--Windows上でASKAのようなC++のソースをコンパイルするのに...
--幸いなことに、私はこれを使える環境にあった。しかし、こ...
COLOR(#009900){・askaβ19(英語版)はMinGWでコンパイルできま...
--そんなことをつぶやいていると、英雄I.Takさんからアドバイ...
--MinGWについて調べてみた。おぉ!。これは、ヨースルに、Li...
http://sourceforge.net/projects/mingw/
--ちょっとわかりにくかったが、このページ内の、''DOWNLOAD'...
--あれれ? MinGWは何種類かバージョンがある。I.Takさんのア...
--そんなわけなので、両方とも入手してみた。MinGW-1.1.tar.g...
--さて、まずはこれらをセットアップする。2.0は簡単だ。exe...
-ソースの入手。しかし、落とし穴が!
--ソースを入手すべく、今原さんのページへ。aska10b18.lzh ...
--解凍すると、中には出来上がっているASKAとソースが入って...
--・・・・・・あれ????
--実は、大変な勘違いをしていたことが分かった。ASKAの最新...
--そんなわけで、慌てて調べてみると、ASKAの最新版は、[[OSA...
--さっそくダウンロードしなおして、C:\aska_m にコピーしな...
-コンパイルしてみる。''まずは、MSVC++6''
--これは、極めて簡単だった。ASKAのソースの中に、ASKA.dws ...
--あとは単にビルドするだけ。debug というディレクトリが出...
-コンパイルしてみる。''MinGW1.1 の場合''
--ASKAのソースの中に、gmake.bat というバッチファイルがあ...
--・・・あかん・・・。なんでだろう????
--だいぶなやまされたが、へんなことに気付いた。今現在、私...
--コンパイル成功! aska.exe が作られた。
-コンパイルしてみる。''MinGW2.0 の場合''
--さて、こんどはMinGW2.0だ。↑ のパターンで考えると、おそ...
--また、なぜか MinGW2.0 には、 makeコマンドがない。探して...
--また、よくほかのディレクトリを見てみると、1.1とは微妙に...
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;%PA...
SET GCC_EXEC_PREFIX=%MINGW%\lib\gcc-lib\mingw32\3.2
SET LIBRARY_PATH=%MINGW%\lib;%MINGW%\lib\gcc-lib\mingw32...
SET C_INCLUDE_PATH=%MINGW%\include
SET CPLUS_INCLUDE_PATH=%MINGW%\include\c++
SET OBJC_INCLUDE_PATH=%MINGW%\lib\gcc-lib\mingw32\3.2\in...
make
del gmake.pif
--そして、忘れてはいけないのがクリーン作業。つまり、さっ...
--さて、ではコンパイル。 gmake.bat を実行する。
module.h: In member function `void Module::Release()':
module.h:37: ISO C++ forbids casting to an array type `u...
module.h:37: ISO C++ forbids casting to an array type `u...
module.h:37: ISO C++ forbids casting to an array type `u...
make: *** [main.o] Error 1
--・・・・あれぇ???。こんなエラーが出た。
--これは、C++コンパイラのエラーだ。うーん・・。どういうこ...
COLOR(#009900){・なんか文法チェックが厳しくてはねられてい...
COLOR(#009900){・とりあえず問題のmodule.hの37行目の[]を*...
--Kタンから、こんなアドバイスが!。有難い!さっそく実践。
void Release(void){ DELETEPTR_SAFE((unsigned char[])lpM...
''↓''
void Release(void){ DELETEPTR_SAFE((unsigned char*)lpMd...
--この変更で、無事、コンパイルに成功しました。
---あとで教えてもらったことなんですが、MinGW1.0はgcc2.95....
-検証と考察
COLOR(#009900){・8月頭までは多少時間があるので、LinuxとWi...
COLOR(#009900){・今度はちゃんと落とせたました。早速、OSAS...
--こうして出来上がった3つのASKA。動作はみなさんが手伝って...
--問題としては、出来上がったASKAが軒並み大きいということ...
---MSVC++6: 99kbyte
---MinGW1.1: 79kbyte
---MinGW2.0: 115kbyte
--うーん・・・どうなんでしょう。とりあえずはこれでOKとし...
*ASKAをLinuxに移植する試み
さて、上記のような作業を通してちょっとだけものが解ったつ...
-まずは、下準備ね。
--getした''srcset05.lzh''をLinux上で解凍する。これは、
~/$ lha -x srcset05.lzh
--で楽々。カレントも移っておこう。
~/$ cd aska/ensrc
~/aska/ensrc$
-一応。 ''makefile'' を、 ''Makefile''にリネームしておく。
***俺は乱暴ものだ!!
-そういうわけで、とりあえず下準備はOKなのだ。さて、どうす...
~/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$
-・・・そんなわけで、いきなりエラーが出ました。まあ、当然...
-さて、ここでちと考えて見る。C とかって、ソースファイルが...
-この場合、自動的にやってくれる make だと、エラーが出た時...
~/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 tex...
generator.cpp module.cpp scanner.cpp table.cpp
-ふむふむ。cppファイルは全部で9個ある。
~/aska/ensrc$ ls *.o
filepath.o stringx.o textmodule.o
~/aska/ensrc$
-・・・おぉぉ!。objファイルがいつのまにか3個出来ているぞ...
***残りの6個のcppファイルをコンパイルテスト
--まず、ここいらあたりから。さっそく単品コンパイル。
~/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>
・
・
-うーん。この #include <io.h> に問題があるみたい。どれど...
-あっれぇ??。コンパイルが成功したWindowsのMinGWのほうを...
-LinuxBOXのHDの中をあっちこっち探してみると、やっと見つけ...
-気になったので、おのおのの中身とMinGWのヤツを見比べてみ...
-・・・・あっれぇ???。C言語出来ない私だけど、なんか、...
-判明した。なんと、これ、たまたま同じ名前っつーだけで、ぜ...
-・・・必殺技!!! コメントアウトじゃぁ~!!! (と...
-俺は乱暴者だぁ~・・・
***さて、手始めに、 scanner.cpp あたりから。
-ではでは。さっそくコンパイルしてみる。
~/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$
-ふーん・・・。scanner.cpp ではなくて、インクルードしてい...
// ポインタが非NULLならばdeleteするマクロ
#define DELETE_SAFE(var) \
if (var != NULL) {\
delete var;\
var = NULL;\
}
-ふむ。ここいらへん、どうも行が長いので、¥ で割っている...
// ポインタが非NULLならばdeleteするマクロ
#define DELETE_SAFE(var) if (var != NULL) { delete var; ...
-これがなんと、大当たり!!。この部分ではエラーが出なくな...
-でも、こんどが別の部分で同じようなエラー文が。
-あららら?。いま直した部分のすぐ下に、ほとんど同じような...
// クラスのポインタ等をdeleteするマクロ
#define DELETEPTR_SAFE(var) \
if (var != NULL) {\
delete [] var;\
var = NULL;\
-よし。ここも同じく一行にしてみよう。
// クラスのポインタ等をdeleteするマクロ
#define DELETEPTR_SAFE(var) if (var != NULL) { delete []...
-おぉ!無事、コンパイル終了だ! また野望に一歩近づいた!!
***おっしゃぁ! 次は、parser.cpp じゃ!
-さっそくコンパイル。
~/aska/ensrc$ gcc -O2 -c parser.cpp
parser.cpp: In method `long int Parser::LocalAddress(Par...
parser.cpp:113: implicit declaration of function `int lt...
parser.cpp: In method `long int Parser::Selector(Paramet...
-うーん。このエラーを調べてみると、「そんな関数、シラネー...
-うひゃぁ!。えらいことだ。LinuxのGCCでは、「そんな関数、...
-捨てる神あれば拾う神ありで、sprintf関数で代用できるつー...
Error("Cannot use \"&\" for register, ar...
return 5;
}
param.disp += ltoa(selparam.ndisp + label->nLoca...
return 0;
}
-を、以下のように書き換え。
Error("Cannot use \"&\" for register, ar...
return 5;
}
param.disp += sprintf(buf,"%ld",selparam.ndisp + ...
return 0;
-念のため、ほかにこの関数がないか検索・・・。あったあった...
if(param.ndisp != 0){
if(param.disp == ""){
param.disp += ltoa(param.ndisp, b...
}else{
param.disp += dummy + "+" + ltoa(...
}
param.ndisp = 0;
''↓''
if(Selector2(param) != 0) return 1;
if(param.ndisp != 0){
if(param.disp == ""){
param.disp += sprintf(buf,"%ld",p...
}else{
param.disp += dummy + "+" + sprin...
}
param.ndisp = 0;
-さーて、これでいいはず。再びコンパイル。
~/aska/ensrc$ gcc -O2 -c parser.cpp
parser.cpp: In method `long int Parser::Selector(Paramet...
parser.cpp:151: no match for `basic_string<char,string_c...
~/aska/ensrc$
-おんやぁ~?。なんだろう。このエラー。
-調べてみると、どうも、変数の型式が違うと怒っているらしい...
-結局、151行目を以下のようにすることで解決。これでいいの...
sprintf(buf,"%ld",param.ndisp);param.disp += du...
-まあ、とりあえず、これでよしということにしておこう。(ど...
-ltoaは
#define ltoa(n,b,l) (spfintf(b,"%ld",n), b)
-とマクロ定義にすればパッチも小さくなってよいと思われ。(I...
***module.cpp いってみようか!
-コンパイルすると、
~/aska/ensrc$ gcc -O2 -c module.cpp
module.cpp: In method `long int Module::ReadFile(string ...
module.cpp:26: implicit declaration of function `int fil...
-っとまあ、こういうエラーがでる。たしか、このパターンは、...
-調べてみると、どうもこいつも、MinGWに特有の関数らしい。...
-いやぁ~。あるもんですな。そんなわけで、以下のブロックを...
#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);
-なんと、これだけでOKでしたぁ。 (ルンルン♪)
---I.Takさん、感謝~。
--勝手に修正して, 元の部分を外に出しておいたのはやはりま...
---うわぁぁ! 再度感謝。勘違いして元に戻してしまい、いま...
***generator.cpp いくぞー!
-コンパイル。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::Param2LPSTR(ch...
generator.cpp:45: implicit declaration of function `int ...
generator.cpp:45: passing `int' to argument 2 of `strcat...
・
・
~/aska/ensrc$
-ふーん。なるほど。一杯出てきたけど、これは parser.cpp の...
-えーと、どれどれ、いっぱいあるなぁ・・・。45・68・79行目...
45行目 strcat(buf, ltoa(param.ndis...
68行目 strcat(buf, ltoa(param.scal...
79行目 strcat(buf, ltoa(param.ndis...
''↓''
45行目 strcat(buf, sprintf(buf2,"%...
68行目 strcat(buf, sprintf(buf2,"%...
79行目 strcat(buf, sprintf(buf2,"%...
-よーし。これでいいかな。コンパイル。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::Param2LPSTR(ch...
generator.cpp:45: passing `int' to argument 2 of `strcat...
generator.cpp:68: passing `int' to argument 2 of `strcat...
generator.cpp:79: passing `int' to argument 2 of `strcat...
-うにゃぁ?あれれ、なんじゃこりゃ?。うーん???。なんか、...
-そんなわけで、こういう風に変更。(・・・だんだん自身がな...
45行目 sprintf(buf2,"%ld",param.nd...
68行目 sprintf(buf2,"%ld",param.nd...
79行目 sprintf(buf2,"%ld",param.nd...
-さーて、こんどこそ大丈夫かな。
~/aska/ensrc$ gcc -O2 -c generator.cpp
generator.cpp: In method `void Generator::RegistMul(Para...
generator.cpp:510: implicit declaration of function `int...
generator.cpp:510: passing `int' to argument 2 of `strca...
generator.cpp: In method `void Generator::RegistDiv(Para...
generator.cpp:554: passing `int' to argument 2 of `strca...
-あらら?。今直した所はパスしているみたいだけど、別のとこ...
-調べてみたら、これも3箇所もあった。一気に修正。ただし、...
510行目 strcpy(buf, buf1); strcat(buf, ","); str...
554行目 strcat(buf, ","); strcat(buf, itoa(x, bu...
722行目 OutputMASM("#local", "equ", itoa(sysvarl...
''↓''
510行目 strcpy(buf, buf1); strcat(buf, ","); spr...
554行目 strcat(buf, ","); sprintf(buf1,"%d",x);s...
722行目 sprintf(buf,"%d",sysvarlocalvalue);Outpu...
-いよーし!!。これでコンパイル、完了!!!
***うおぉぉ! table.cpp じゃ!
-さーて・・・こいつはどこ修正するのかなぁ・・・
~/aska/ensrc$ gcc -O2 -c table.cpp
~/aska/ensrc$
-・・・・あれ? 通っちゃった・・・ ひえぇーー!!
*** main.cpp キタ━━━━(゚∀゚)━━━━ッ!!
-いくぞ!! ラスト!
~/aska/ensrc$ gcc -O2 -c main.cpp
~/aska/ensrc$
-・・・・逝ってくれましたぁ・・・
-え?つーことは???。全コンパイル、いけるのか! いっけ...
***ASKAちゃん、大地に立つ!
-えーと・・・。そんなわけで、これでとりあえず、LinuxでASK...
・
・
GC = gcc
CFLAGS = -O2 -I.
CPPFLAGS =
PGNAME = aska.exe
#
# SRC Directory
・
・
''↓''
・
・
GC = gcc
CFLAGS = -O2 -I.
CPPFLAGS =
PGNAME = aska
#
# SRC Directory
・
・
-さて、それでは一旦クリーンして、いよいよmake。
~/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 filepat...
strip aska
~/aska/ensrc$
-うおぉぉ!! ついに、ついにASKA、完成じゃぁぁぁぁぁぁ!...
-ASKAか・・・・ なにもかもがみななつかすい・・・・・(T∀T)
*ASKA、新たなる旅立ち
-さてさて、そーゆーわけで、ついにASKAがコンパイルできまし...
-そんなわけで、とりあえず tolset05.lzh に付属の hello0.as...
・
・
・
・
SIZE(25){う・・・うごいたぁ・・・・・}
*ASKA 発動編----
-そんなわけでコンパイルに成功し、またとりあえず簡単な動作...
-そんな折、T.Takさんからもコンパイル成功の一報が入る。
----
*一応報告(I.Tak.)
-LinuxでASKAをコンパイルだけすることに成功しました。
--module.h(多分): #include <io.h> を #include <sys/io.h> ...
--module.cpp: filelength関数 (メソッド?) を自作 (fstat関...
--generator.cpp, parser.cpp: ltoa, itoa 関数を自作
--main.cpp: usageに入っている ":" を ": " に置換(^^;
---g++ -O2 -c *.cpp
---gcc -O2 -c *.c #Cソースを自作したので
---g++ -o aska *.o
-これでバイナリができます。%%でもscanner.PeekTokenがすぐ...
-ちなみにコンパイラは 2.95.4。3.0を使ったら unsigned char...
----
-うーん、そんなわけなので、私が作った版のパッチを作成して...
COLOR(#009900){・検証作業完了!。すくなくとも、tolset05.l...
COLOR(#009900){・パッチが完成しました。動作実験を行ってく...
COLOR(#009900){・パッチ希望! 自分でやったら (変にマクロを...
COLOR(#009900){・g++ 2.95.3 でコンパイルしたら, 入力をま...
COLOR(#009900){・うあぁぁぁ・・・(T∀T) 了解です。ちと...
COLOR(#009900){・おっかしいですねぇ・・・。うちのデビでは...
COLOR(#009900){・RHL9,compat-gcc-7.3-2.96.118で、CCにgcc2...
COLOR(#009900){・ご報告、どうもありがとうございます。ええ...
COLOR(#009900){・コンパイルはできても、できあがったASKAが...
-うーん・・・。何人かの方から、コンパイルは出来ても動作し...
-こまりはてた私は、ヤケクソであっちこっちにデバッグ用の p...
COLOR(#009900){・新パッチ動きました (@学校)。hellok0.ask...
-I.Takさんからとんでもないヒントが飛び込んできた。もしや...
-どうやら原因はこれ臭い。そんなわけで、さっそく改行コード...
-見つけた!。module.cpp の最後のほう。
HRESULT Module::ReadLine(LPSTR buf){
int i;
if(lpMdlPos == NULL) return 3;
if(lpMdlPos >= (LPSTR)lpMdlAdr + dwMdlSize) retu...
for(i = 0; i < 1023; i++){
if(*lpMdlPos == 0x0D && *(lpMdlPos+1) ==...
*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) retu...
for(i = 0; i < 1023; i++){
// if(*lpMdlPos == 0x0D && *(lpMdlPo...
if(*lpMdlPos == 0x0D && *(lpMdlPos+1) ==...
*buf = '\0';
lpMdlPos += 2;
return 0; // 1行終了(DOS)
}
if(*lpMdlPos == 0x0A || *lpMdlPos == 0x0...
*buf = '\0';
lpMdlPos += 1;
return 0; // 1行終了(UNIX...
}
*(buf++) = *(lpMdlPos++);
}
*buf = '\0';
return 2; // バッファあふれ
}
-こんな変更をしたパッチを作り、再びテスト隊にみなさんに実...
COLOR(#009900){・動きました。簡単なソースを処理させました...
-キタ━━━━(゚∀゚)━━━━ッ!!
-I.Takさんから動作確認がきました。しかも、最後まで残って...
-さらにすごいオマケがついている。私がこれまで当てずっぽう...
*ASKA めぐり合い宇宙編
-これで、ほぼASKAをLinuxに移植することは成功だと思う。(...
-I.Takさんが最後に清書してくれた版を、ASKAのページにて公...
-この検証が終われば、I.Takさんが書いてくれたhistoryやらな...
ページ名: