Gonta House

ゲームとマンガと模型と戯れる日々の貧乏生活雑記ブログ

Swift版LHAクラス開発

iPhoneで自作アプリにLHAを実装してみたく思うも、OSSとしてGitHubに転がっていない現実。
一応、圧縮/解凍アプリみたいなのはあるんだけれども、完全にオマケ機能っぽいので、それでは使い勝手が悪いので却下。
そりゃあね、LHA自体が開発終了しているし、セキュリティ上の脆弱性などとも言われていることから、今時iPhoneでLHAを扱おうと思う人もいないんでしょうな…。

とりあえずLHAはフリーソフトでありオープンソースでもあるので、ネット上にソースコードが転がっていることから、それをベースに移植することは可能。
しかし、DOSの頃のソースなので、ハフマン符号処理やツリー符号処理のような単純で膨大な繰り返し処理には、高速化のためインラインアセンブラで組まれているという地獄。

そんなわけで先月頃から空いた時間を見つけると、半泣き状態でソースを解析しつつ、「無ければ作るの精神」でSwiftへと移植をしていっているのですが、C言語のような冗長的な記述や曖昧なキャスト、そして何よりも柔軟なポインタ変数や関数ポインタが使用できないため、かなりの苦戦状態…。
インクリメントの「i++」みたいのすら出来ないですからねぇ~。
でまぁ、解凍処理の方が重要だったため、そちらからチマチマと作業を開始して幾日、ヘッダレベル(H0,H1,H2)解析の実装、lh4~lh7デコードの実装、出力ファイルの更新日時のセットまでこぎつけられました。

よっしゃー!これでiPhoneLZH解凍できるぞ!

f:id:gonta_house:20220323202538j:plain

そして、ファイル吐き出しは別処理にしているので、オンメモリでも動作可能。
さぁ~て来週からは、圧縮処理に挑戦してみようかなぁ~?と気合も充分!
まぁ…こっちの方が、さらに難敵なんですけどね。

とはいえ、別言語へのコード移植って、パズルみたいで楽しかったり…。
外出自粛の良い暇つぶしには持って来いってなもんです。

PS.
ふと、iOS版LHAクラス作成、スタバでやっていれば意識高い系の仲間入り出来たじゃん!と思ってみたりするわけですが、意識高い系の人はXcodeでガシガシと泥臭いコーディング&デバッグ作業なんてやらないかぁ~。
っていうか、スタバでMac開いてドヤっている人たちって、いったい何をやっているんだろ?