NEWT0_20040925_2_src を公開しました。
[変更箇所]
– #ifdef __BEOS__ に変更しました
– Makefile を include でプラットフォーム対応するようにしました
[コンパイル環境]
– Mac OS X / Darwin
– Linux
– FreeBSD(要 gmake)
– BeOS
⇒ NEWT0_20040925_2_src.tgz (download)
Tags: NewtonScript
NEWT0_20040925_2_src を公開しました。
[変更箇所]
– #ifdef __BEOS__ に変更しました
– Makefile を include でプラットフォーム対応するようにしました
[コンパイル環境]
– Mac OS X / Darwin
– Linux
– FreeBSD(要 gmake)
– BeOS
⇒ NEWT0_20040925_2_src.tgz (download)
Tags: NewtonScript
速ぁ~。一発make、楽っす。thankです。
FreeBSD のをコピーして、-rdynamic とかいうエラーを吐くオプションを外すと cygwin でも make できました。
-rdynamic がだめということは、拡張ライブラリはちゃんと読込めているでしょうか?
どんなふうにしたら確認できますか?
protoFILE.so が存在する状態で次のスクリプトが正常に動作すれば大丈夫です。
Require(“protoFILE”);
if protoFILE then p(TRUE);
print()で配列やフレームが出力されません。
NewtObj.cのNewtPrint()にあるswitchで
case kNewtBinary:
case kNewtArray:
case kNewtFrame:
が何もせずにbreak;してます。
試しにNewtPrintObject(f, r);を追加したら出力されるようになったのですが、これでいいんでしょうか。
NewtPrint は print 関数に相当するのですが、想定する使用目的の関係で文字列に還元できないデータは出力しないようにしています。フレームや配列をプリントしたい場合は p 関数とそれに相当する C 言語の NSPrt, NewtPrintObject を使用して下さい。
documents/01_howto.txtに
『P(obj) 旧来の Print 関数に相当』
ときちんと載ってました。当初はPrint()があるのに、なぜP()もあるのかわからなかったのですが使用目的が違うということで理解しました。
NewtIO.cのNewtFgets()でbuffに入り切らなかった場合にreallocで入り切るまで拡張するCodeを書いてみました。
if (str != NULL)
{
if (strlen(str) == sizeof(buff)-1) {
char *temp = strdup(str);
int size = sizeof(buff);
int length = 0;
while (str && strlen(str) == size-1) {
length += strlen(str);
temp = (char*)realloc(temp, length+size);
str = fgets(temp+length, size, stream);
}
str = temp;
}
// str[sizeof(buff) – 1] = ‘\0’;
result = NewtMakeString(str, false);
if (str != buff) free(str);
}
無制限に拡張するのってセキュリティホールになっちゃうんのかなぁ。
src/parserのnewt.lでHEX-DIGITが
[A-Ha-h]
となってますが
[A-Fa-f]ではないのでしょか
NewtFgets()、手抜きです(^^;
本当はコメントアウトしてある fgetln を使うほうのインプリメントならいいのですが、プラットフォームによって fgetln を使えないみたいなので fgets を使ってます。
理髪さんのコードを参考に fgetln をシミュレートする方向で修正したいと思います。
HEX-DIGIT….恥ずかしい,その通りです(^^;
修正します。
ちなみに、近日中にマジックポインタをサポートしたバージョンを公開するつもりでいます。
documents/03_problem.txtにあるセミコロンについて調べてみました。PROGRAMMING FOR THE NEWTONによればif文のセミコロンは文法的なものではなく移植性を考慮したもののようです。そこでセミコロンの後に0個以上の空白(改行も含む)の後にelseがくるならelseとするようにsrc/parser/newt.lに
“;”{SPACE}*[Ee][Ll][Ss][Ee] { return lex_makesymbol(“else”, false); }
を追加してみました。(改行も含めると正規表現がまずいのかうまく行かないので空白のみ)
try 文で onexception が複数ある場合途中の onexception では ; が使えないは文法もそうなっていると思います。(プログラミング言語 NewtonScript ver.1.0.0 斎藤くにひろ氏 翻訳より)
改行を含めるとうまくいかないのは newt.l で1行毎に処理するようにしているためです。
; と else でひとつの else とする方法はよい方法なのですが、単純に正規表現だけでやろうとするとコメントが途中に入る場合に対応できません。うーん、字句解析は lex を使わない方法に変更したほうがいいのかも(^^;
NewtFgets() ですが fgetln をシミュレートする方法ではなく、文字オブジェクトに随時追加する方法にしました。インプリメント済みなので次のバージョンに入ります。