1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-17 17:20:29 +02:00

Support ~N in SRFI-19 string->date

* module/srfi/srfi-19.scm (fractional-integer-reader,
  make-fractional-integer-reader): From reference implementation.
  (reader-directives): Handle #\N, from reference implementation.
* test-suite/tests/srfi-19: Add tests for string->date ~N.
* doc/ref/srfi-modules.texi (string->date): Add line for ~N.
This commit is contained in:
Daniel Llorens 2018-12-10 11:57:05 +01:00 committed by Andy Wingo
parent 4f3aa81617
commit 347ec3f088
3 changed files with 37 additions and 0 deletions

View file

@ -1193,6 +1193,24 @@
(lambda (port)
(integer-reader upto port)))
;; read an fractional integer upto n characters long on port; upto -> #f if any length
;;
;; The return value is normalized to upto decimal places. For example, if upto is 9 and
;; the string read is "123", the return value is 123000000.
(define (fractional-integer-reader upto port)
(define (accum-int port accum nchars)
(let ((ch (peek-char port)))
(if (or (eof-object? ch)
(not (char-numeric? ch))
(and upto (>= nchars upto)))
(* accum (expt 10 (- upto nchars)))
(accum-int port (+ (* accum 10) (char->int (read-char port))) (+ nchars 1)))))
(accum-int port 0 0))
(define (make-fractional-integer-reader upto)
(lambda (port)
(fractional-integer-reader upto port)))
;; read *exactly* n characters and convert to integer; could be padded
(define (integer-reader-exact n port)
(let ((padding-ok #t))
@ -1305,6 +1323,7 @@
(define read-directives
(let ((ireader4 (make-integer-reader 4))
(ireader2 (make-integer-reader 2))
(fireader9 (make-fractional-integer-reader 9))
(eireader2 (make-integer-exact-reader 2))
(locale-reader-abbr-weekday (make-locale-reader
locale-abbr-weekday->index))
@ -1343,6 +1362,9 @@
(list #\M char-numeric? ireader2 (lambda (val object)
(set-date-minute!
object val)))
(list #\N char-numeric? fireader9 (lambda (val object)
(set-date-nanosecond!
object val)))
(list #\S char-numeric? ireader2 (lambda (val object)
(set-date-second! object val)))
(list #\y char-fail eireader2