giftopnmのコードに手を入れてGIF形式で地図データをダウンロードしての表示ができるようになりました。Unix環境で動作するコードを使うためにありがちな修正を施しています。
まずは動的なメモリ取得。現在の動作環境ではmallocを用意していないので、静的にメモリを用意するように変更。幸いgiftopnmではmallocは1か所でしか使われていませんでした。局所変数の使われ方も確認。Unix用コードだと、平気で大きなバッファを関数内で局所的にとったりしているので、その関数が呼ばれた時にスタックがあふれて暴走する原因となります。staticに置き換えたり、タスクのスタックサイズを増やしたりして対応。
続いて、メッセージの表示。printfやfprintfを適宜、デバックやsyslogメッセージに書き換え。エラー発生時には、展開動作を終了するように修正。
バッファの使い方もざっと確認して、shortで用が足りそうなところは、intからshortに修正。Unix環境だとほとんど気にしないでとりあえずintで済ましていることが多いですが、メモリ消費量が半分になりますから、違いは大きいですよね。
そんなこんなでなんとかGIF形式から表示できるようになりました。所要時間は短い時は3, 4秒で済むのですが、多くの場合6, 7秒かかってしまうようです。うーん、もう少し快適にダウンロードできないものかなぁ。TINETでは各レイヤでの統計情報を採れるようになっているので、とりあえずHDLCとPPPでのエラー発生状況を確認してみましたが問題は発生していないようです。
まずは動的なメモリ取得。現在の動作環境ではmallocを用意していないので、静的にメモリを用意するように変更。幸いgiftopnmではmallocは1か所でしか使われていませんでした。局所変数の使われ方も確認。Unix用コードだと、平気で大きなバッファを関数内で局所的にとったりしているので、その関数が呼ばれた時にスタックがあふれて暴走する原因となります。staticに置き換えたり、タスクのスタックサイズを増やしたりして対応。
続いて、メッセージの表示。printfやfprintfを適宜、デバックやsyslogメッセージに書き換え。エラー発生時には、展開動作を終了するように修正。
バッファの使い方もざっと確認して、shortで用が足りそうなところは、intからshortに修正。Unix環境だとほとんど気にしないでとりあえずintで済ましていることが多いですが、メモリ消費量が半分になりますから、違いは大きいですよね。
そんなこんなでなんとかGIF形式から表示できるようになりました。所要時間は短い時は3, 4秒で済むのですが、多くの場合6, 7秒かかってしまうようです。うーん、もう少し快適にダウンロードできないものかなぁ。TINETでは各レイヤでの統計情報を採れるようになっているので、とりあえずHDLCとPPPでのエラー発生状況を確認してみましたが問題は発生していないようです。