なんだこれは

はてなダイアリーから移転しました。

gauche で gzip archive

Gauchegzip archive

Intel Macgauchegzip 圧縮されたファイルを解凍

TL; DR

こう書いて

(use rfc.zlib)

(define (gz->raw gz-file raw-file)
  (call-with-input-file gz-file
    (lambda (in-port)
      (call-with-output-file raw-file
      (lambda (out-port)
          (copy-port 
              (open-inflating-port in-port :window-bits 47)
              out-port))))))
          
          

こう

(gz->raw "NOTICE.xml.gz" "NOTICE.xml")

個人的なはまりポイント

gauche の zlib って gzip アーカイブもいけるんだすごいって始めたんだけど、なんだかできないなぁって、なせかエラーでるしどうしたんだろう。そうだ AI に聞いてみようとかいろいろしていた。

zipinfo NOTICE.xml.gz したらフォーマットがおかしい。zip じゃなくないみたいにいわれた。そらそうだ。

それで、一回放置して、しばらくしてから、もう一回見なおしたら、単純に (open-inflating-port in-port :window-bits 47):window-bitsタイプミスしていたっぽい。するっとうまくいってしまった。

どこではまったんだろう。クリアするともうわからない。

古の do..while(0)

C 言語のマクロで複数行にまたがるものは dowhile(0) で囲む。これは例えば、#define swap(type,a,b) type _c;_c=a;a=b;b=_c;みたいな、場合を考える。

そうなると swap(int,x,y) でint型の変数のx,yを交換できそうに見えるかもしれない。しかし、cの if 文の then else 節を中括弧で囲まなかった場合に一部だけが分離して考えられるからである。

しかし、現代ではもう inline 関数があるのでこのような場合はマクロではなく、 inline 関数でいいのだった。