* Guile base64
@ 2010-09-01 18:10 Romel Sandoval
2010-09-02 8:12 ` Ludovic Courtès
0 siblings, 1 reply; 10+ messages in thread
From: Romel Sandoval @ 2010-09-01 18:10 UTC (permalink / raw)
To: guile-user
Hi
What happened to base64 library on Guile recent versions?
I have see that was on Guile 1.4 (ice-9 base64) [1]. Even the code
appears to be available [2].
Also I found an old guile project (codesystem base64) [3]
Anybody knows if it's going to be reincorporated into Guile libraries or
not?
[1] http://www.gnuvola.org/software/guile/doc/Base64.html
[2] http://cygwin.ru/ml/guile/2000-01/msg00622.html
[3] http://www.gnu.org/software/guile/old-gnu-guile-projects.html
Regards,
--
Romel R. Sandoval-Palomo
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-01 18:10 Guile base64 Romel Sandoval
@ 2010-09-02 8:12 ` Ludovic Courtès
2010-09-02 18:49 ` Andy Wingo
0 siblings, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2010-09-02 8:12 UTC (permalink / raw)
To: guile-user
Hello!
Romel Sandoval <romel@lavabit.com> writes:
> What happened to base64 library on Guile recent versions?
As far as I know there’s never been an (ice-9 base64) module in
GNU Guile, but...
[...]
> [1] http://www.gnuvola.org/software/guile/doc/Base64.html
> [2] http://cygwin.ru/ml/guile/2000-01/msg00622.html
> [3] http://www.gnu.org/software/guile/old-gnu-guile-projects.html
Item [1] points to a Guile 1.4 fork maintained by Thien-Thi Nguyen.
Thien-Thi now has commit rights to the Guile repository so it’d be great
if he would add this module in ‘master’. :-)
(Alternatively, if this strategy fails, you can submit a patch.)
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-02 8:12 ` Ludovic Courtès
@ 2010-09-02 18:49 ` Andy Wingo
2010-09-02 23:34 ` Andreas Rottmann
0 siblings, 1 reply; 10+ messages in thread
From: Andy Wingo @ 2010-09-02 18:49 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guile-user
Greets,
On Thu 02 Sep 2010 01:12, ludo@gnu.org (Ludovic Courtès) writes:
> Romel Sandoval <romel@lavabit.com> writes:
>
>> What happened to base64 library on Guile recent versions?
There is
http://gitorious.com/tekuti/tekuti/blobs/master/tekuti/base64.scm
also.
Cheers,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-02 18:49 ` Andy Wingo
@ 2010-09-02 23:34 ` Andreas Rottmann
2010-09-03 20:15 ` Romel Sandoval
0 siblings, 1 reply; 10+ messages in thread
From: Andreas Rottmann @ 2010-09-02 23:34 UTC (permalink / raw)
To: Andy Wingo; +Cc: Ludovic Courtès, guile-user
Andy Wingo <wingo@pobox.com> writes:
> Greets,
>
> On Thu 02 Sep 2010 01:12, ludo@gnu.org (Ludovic Courtès) writes:
>
>> Romel Sandoval <romel@lavabit.com> writes:
>>
>>> What happened to base64 library on Guile recent versions?
>
> There is
>
> http://gitorious.com/tekuti/tekuti/blobs/master/tekuti/base64.scm
>
Also the R6RS version, which should probably work in Guile as well (and
it is defmacro-free ;-).
http://gitorious.org/tekuti/tekuti/blobs/t/r6rs/do-port/tekuti/base64.sls
[ I really need to make another pass over Tekuti, now that Guile has
R6RS support -- this could bring the versions a good deal closer
together. ]
Regards, Rotty
--
Andreas Rottmann -- <http://rotty.yi.org/>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-02 23:34 ` Andreas Rottmann
@ 2010-09-03 20:15 ` Romel Sandoval
2010-09-05 21:58 ` Thien-Thi Nguyen
0 siblings, 1 reply; 10+ messages in thread
From: Romel Sandoval @ 2010-09-03 20:15 UTC (permalink / raw)
To: Andreas Rottmann; +Cc: Andy Wingo, Ludovic Courtès, guile-user
El vie, 03-09-2010 a las 01:34 +0200, Andreas Rottmann escribió:
> Andy Wingo <wingo@pobox.com> writes:
>
> > Greets,
> >
> > On Thu 02 Sep 2010 01:12, ludo@gnu.org (Ludovic Courtès) writes:
> >
> >> Romel Sandoval <romel@lavabit.com> writes:
> >>
> >>> What happened to base64 library on Guile recent versions?
> >
> > There is
> >
> > http://gitorious.com/tekuti/tekuti/blobs/master/tekuti/base64.scm
> >
> Also the R6RS version, which should probably work in Guile as well (and
> it is defmacro-free ;-).
>
> http://gitorious.org/tekuti/tekuti/blobs/t/r6rs/do-port/tekuti/base64.sls
>
> [ I really need to make another pass over Tekuti, now that Guile has
> R6RS support -- this could bring the versions a good deal closer
> together. ]
>
> Regards, Rotty
Do you think any of mentioned implementations should be included with
Guile 2.0 or it's better to keep it apart?
Regards, Romel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-03 20:15 ` Romel Sandoval
@ 2010-09-05 21:58 ` Thien-Thi Nguyen
2010-09-05 22:47 ` Ludovic Courtès
2010-09-06 9:59 ` Andy Wingo
0 siblings, 2 replies; 10+ messages in thread
From: Thien-Thi Nguyen @ 2010-09-05 21:58 UTC (permalink / raw)
To: Romel Sandoval; +Cc: guile-user
() Romel Sandoval <romel@lavabit.com>
() Fri, 03 Sep 2010 15:15:58 -0500
Do you think any of mentioned implementations should be
included with Guile 2.0 or it's better to keep it apart?
Probably next week (2010-09-13 onward) i can find some time to add
(ice-9 base64) from Guile 1.4.x. However, that implementation uses
‘(srfi srfi-56) read-byte’, which is not available in Guile 2.
Could someone suggest a replacement?
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-05 21:58 ` Thien-Thi Nguyen
@ 2010-09-05 22:47 ` Ludovic Courtès
2010-09-06 9:39 ` Thien-Thi Nguyen
2010-09-06 9:59 ` Andy Wingo
1 sibling, 1 reply; 10+ messages in thread
From: Ludovic Courtès @ 2010-09-05 22:47 UTC (permalink / raw)
To: guile-user
Hi,
Thien-Thi Nguyen <ttn@gnuvola.org> writes:
> () Romel Sandoval <romel@lavabit.com>
> () Fri, 03 Sep 2010 15:15:58 -0500
>
> Do you think any of mentioned implementations should be
> included with Guile 2.0 or it's better to keep it apart?
>
> Probably next week (2010-09-13 onward) i can find some time to add
> (ice-9 base64) from Guile 1.4.x. However, that implementation uses
> ‘(srfi srfi-56) read-byte’, which is not available in Guile 2.
> Could someone suggest a replacement?
Maybe (rnrs bytevectors) and (rnrs io ports)?
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-05 22:47 ` Ludovic Courtès
@ 2010-09-06 9:39 ` Thien-Thi Nguyen
0 siblings, 0 replies; 10+ messages in thread
From: Thien-Thi Nguyen @ 2010-09-06 9:39 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guile-user
() ludo@gnu.org (Ludovic Courtès)
() Mon, 06 Sep 2010 00:47:46 +0200
> Could someone suggest a replacement?
Maybe (rnrs bytevectors) and (rnrs io ports)?
Thanks for the tip; i'll look into those modules.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-05 21:58 ` Thien-Thi Nguyen
2010-09-05 22:47 ` Ludovic Courtès
@ 2010-09-06 9:59 ` Andy Wingo
2010-09-28 12:48 ` Thien-Thi Nguyen
1 sibling, 1 reply; 10+ messages in thread
From: Andy Wingo @ 2010-09-06 9:59 UTC (permalink / raw)
To: Thien-Thi Nguyen; +Cc: guile-user
Hi,
On Sun 05 Sep 2010 23:58, Thien-Thi Nguyen <ttn@gnuvola.org> writes:
> () Romel Sandoval <romel@lavabit.com>
> () Fri, 03 Sep 2010 15:15:58 -0500
>
> Do you think any of mentioned implementations should be
> included with Guile 2.0 or it's better to keep it apart?
>
> Probably next week (2010-09-13 onward) i can find some time to add
> (ice-9 base64) from Guile 1.4.x
Cool!
Perhaps we could combine interfaces -- the stream-based (I presume; I
haven't seen your code yet, but I know your Scheme code looks good)
interfaces from yours, and the map-3-to-4 stuff from Andreas' R6RS port
of my base64.scm.
I say this because the r6rs port already uses bytevectors, and compiles
down to fairly tight VM code. I haven't run benchmarks though.
Cheers,
Andy
--
http://wingolog.org/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Guile base64
2010-09-06 9:59 ` Andy Wingo
@ 2010-09-28 12:48 ` Thien-Thi Nguyen
0 siblings, 0 replies; 10+ messages in thread
From: Thien-Thi Nguyen @ 2010-09-28 12:48 UTC (permalink / raw)
To: Andy Wingo; +Cc: guile-user
[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]
() Andy Wingo <wingo@pobox.com>
() Mon, 06 Sep 2010 11:59:15 +0200
Perhaps we could combine interfaces -- the stream-based (I presume; I
haven't seen your code yet, but I know your Scheme code looks good)
interfaces from yours, and the map-3-to-4 stuff from Andreas' R6RS port
of my base64.scm.
I say this because the r6rs port already uses bytevectors, and compiles
down to fairly tight VM code. I haven't run benchmarks though.
Please find below a five-minute port of (ice-9 base64) to Guile 1.9.x.
To play, write it to /tmp and try something like:
$ cd /tmp
$ cat > hack <<EOF
(use-modules (ice-9 base64))
(base64-encode #t (open-input-file "/tmp/hack") 44)
(newline)
EOF
$ base64 -w 44 hack > A
$ guile -l base64.scm -s hack | diff A -
Probably the next step is to settle the interface. I am biased towards
1.4.x compatability but am open (albeit reluctantly) to breaking it.
Once the interface is settled, i'll add docs and some perfunctory tests
and repost. WRT performance -- feel free to rewrite things afterwards;
i'm not yet up to speed (har har) on this area of Guile development
enough to help more than hinder.
[-- Attachment #2: base64.scm --]
[-- Type: application/octet-stream, Size: 8942 bytes --]
;;; base64.scm --- base64 encode/decode
;; Copyright (C) 2010 Free Software Foundation, Inc.
;; Copyright (C) 2004, 2005, 2007 Thien-Thi Nguyen
;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;; License as published by the Free Software Foundation; either
;; version 3 of the License, or (at your option) any later version.
;;
;; This library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Lesser General Public License for more details.
;;
;; You should have received a copy of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
;;; Commentary:
;; The base64 encoding (rfc 2045) is basically a 3-byte to
;; 4-byte transform:
;;
;; GGGGGGGG NNNNNNNN UUUUUUUU <=> GGGGGG GGNNNN NNNNUU UUUUUU
;; GGGGGGRR RRRROOOO OOKKKKKK <=> GGGGGG RRRRRR OOOOOO KKKKKK
;;
;; modulo line breaks and terminating delimiters. It is widely used
;; in MIME and other protocols where the transmission medium may not
;; be guaranteed 8-bit clean.
;;; Code:
(define-module (ice-9 base64)
#:export (base64-encode base64-decode)
#:use-module ((rnrs io ports) #:select (get-u8)))
;;; support
(define (getb!-proc port)
(lambda ()
(let ((b (get-u8 port)))
(and (not (eof-object? b)) b))))
(define (analyze-input input) ; => (getb! . exp-input)
(cond ((string? input)
(cons (getb!-proc (open-input-string input))
(string-length input)))
((port? input)
(cons (getb!-proc input)
(and (port-filename input)
(let ((guess (false-if-exception
(stat:size (stat input)))))
(and (number? guess)
(positive? guess)
guess)))))
(else #f)))
(define c2i char->integer)
(define i2c integer->char)
(define (char+ c n)
(i2c (+ (c2i c) n)))
(define *reasonable-chunk* (ash 1 (ash 1 (ash 1 (ash 1 (ash 1 0)))))) ; 64 KiB
(define subs substring)
(define (make-buffer-stack size)
(let ((cur #f) (stack '()) (idx size))
(define (new!)
(set! cur (make-string size))
(set! stack (cons cur stack))
(set! idx 0))
(define (spill!)
(or (= idx size) (set-car! stack (subs (car stack) 0 idx)))
(let ((res (apply string-append (reverse! stack))))
(set! cur #f)
(set! stack '())
(set! idx size)
res))
;; rv
(lambda (c)
(cond (c (and (= idx size) (new!))
(string-set! cur idx c)
(set! idx (1+ idx)))
(else (spill!))))))
(define (make-outp-buffer outp size)
(let ((buf (make-string size)) (idx 0) (count 0))
(define (>OUT flush? x) ;;; todo: make non-blocking if (not flush?)
(display x outp)
(and flush? (force-output outp)))
(define (new!)
(>OUT #f buf)
(set! idx 0))
(define (spill!)
(>OUT #t (if (= idx size) buf (subs buf 0 idx)))
(set! idx 0)
(let ((rv count))
(set! count 0)
rv))
;; rv
(lambda (c)
(cond (c (and (= idx size) (new!))
(string-set! buf idx c)
(set! idx (1+ idx))
(set! count (1+ count)))
(else (spill!))))))
(define (make-ob! output size) ; output bufferer
(if output
(make-outp-buffer (if (eq? #t output)
(current-output-port)
output)
(min *reasonable-chunk* size))
(make-buffer-stack size)))
;;; encoding
(define *enc-map*
(let ((em (make-vector 64 #f)))
(vector-set! em 62 #\+)
(vector-set! em 63 #\/)
(do ((i 0 (1+ i)))
((= i 26) em) ; rv
(and (< i 10)
(vector-set! em (+ 52 i) (char+ #\0 i)))
(vector-set! em (+ 0 i) (char+ #\A i))
(vector-set! em (+ 26 i) (char+ #\a i)))))
(define (encode! output getb! line-break crlf exp-input)
(let* ((bgrp (and line-break (quotient (max 4 line-break) 4)))
(ob! (make-ob! output
(if exp-input
;; compute exact result size
(let ((raw (* 4 (inexact->exact
(ceiling (/ (1- exp-input)
3))))))
(+ raw (if bgrp
(* (quotient raw (* 4 bgrp))
(if crlf 2 1))
0)))
*reasonable-chunk*)))
(lb! (if crlf
(lambda () (ob! #\cr) (ob! #\newline))
(lambda () (ob! #\newline)))))
(define (acc! x)
(ob! (if x (vector-ref *enc-map* x) #\=)))
(let loop ((group bgrp))
(let* ((g (getb!)) ; do not use `let' here
(n (getb!))
(u (getb!)))
(cond (g
(and bgrp (zero? group) (begin (lb!) (set! group bgrp)))
(acc! (ash g -2))
(acc! (and (or g n)
(logior (ash (logand (or g 0) 3) 4)
(logand (ash (or n 0) -4) 15))))
(acc! (and (or n u)
(logior (ash (logand (or n 0) 15) 2)
(ash (or u 0) -6))))
(acc! (and u (logand u 63)))))
(if (and g n u)
(loop (and bgrp (1- group)))
(ob! #f))))))
;; Write to @var{out-port} the result of base64-encoding @var{input} and
;; return the number of bytes written. If @var{out-port} is #t, send to
;; the current output port. If @var{out-port} is #f, return the
;; result as a string, instead. @var{input} may be a string or a port.
;;
;; Optional third arg @var{line-break} specifies the maximum number of columns
;; to appear in the result before a line break. Actual number of columns is a
;; rounded-down multiple of four, but not less than four. The result never
;; ends with a line break. #f means omit line breaks entirely.
;;
;; Optional fourth arg @var{crlf?} non-#f means use @sc{crlf} for line breaks
;; instead of simply @sc{lf}.
;;
;;-sig: (out-port input [line-break [crlf?]])
;;
(define (base64-encode out-port input . opts)
(or (and=> (analyze-input input)
(lambda (pair) ; (getb! . exp-input)
(encode! out-port
(car pair)
(and (not (null? opts))
(car opts))
(and (not (null? opts))
(not (null? (cdr opts)))
(cadr opts))
(cdr pair))))
(error "bad input:" input)))
;;; decoding
(define *dec-map*
(let ((dm (make-vector 256 #f)))
(do ((i 0 (1+ i)))
((= i 64) dm) ; rv
(vector-set! dm (c2i (vector-ref *enc-map* i)) i))))
(define byte-whitespace?
(let ((ws-bytes (map c2i '(#\space #\np #\nl #\cr #\ht #\vt))))
(lambda (b) (memq b ws-bytes))))
(define (decode! output getb! exp-input)
(let ((ob! (make-ob!
output
(if exp-input
;; approximate result size (whitespace not known a priori)
(inexact->exact (ceiling (* 3 (/ (1+ exp-input) 4))))
*reasonable-chunk*))))
(define (acc! x)
(ob! (i2c x)))
(define (find!)
(let ((b (getb!)))
(and b (if (byte-whitespace? b)
(find!)
(vector-ref *dec-map* b)))))
;; do it!
(let loop ()
(let* ((g (find!)) ; do not use `let' here
(r (find!))
(o (find!))
(k (find!)))
(and g r (acc! (logior (ash g 2) (ash r -4))))
(and r o (acc! (logior (ash (logand r 15) 4) (ash o -2))))
(and o k (acc! (logior (ash (logand o 3) 6) k)))
(if (and g r o k)
(loop)
(ob! #f))))))
;; Write to @var{out-port} the result of base64-decoding @var{input} and
;; return the number of bytes written. If @var{out-port} is #t, send to
;; the current output port. If @var{out-port} is #f, return the
;; result as a string, instead. @var{input} may be a string or a port.
;;
(define (base64-decode out-port input)
(or (and=> (analyze-input input)
(lambda (pair) ; (getb! . exp-input)
(decode! out-port
(car pair)
(cdr pair))))
(error "bad input:" input)))
;;; base64.scm ends here
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-09-28 12:48 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-01 18:10 Guile base64 Romel Sandoval
2010-09-02 8:12 ` Ludovic Courtès
2010-09-02 18:49 ` Andy Wingo
2010-09-02 23:34 ` Andreas Rottmann
2010-09-03 20:15 ` Romel Sandoval
2010-09-05 21:58 ` Thien-Thi Nguyen
2010-09-05 22:47 ` Ludovic Courtès
2010-09-06 9:39 ` Thien-Thi Nguyen
2010-09-06 9:59 ` Andy Wingo
2010-09-28 12:48 ` Thien-Thi Nguyen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).