>From 90baf8cdfe8ce356ee4720a012e0deb5a2cb5818 Mon Sep 17 00:00:00 2001 From: Ian Price Date: Sat, 19 Jan 2013 17:05:27 +0000 Subject: [PATCH] Fix argument count for various format string escape sequences. * module/language/tree-il/analyze.scm (format-string-argument-count): Handle ~t and ~k options case-insensitively. ~! ~| ~/ ~q and ~Q should not update the min-count or max-count. ~^ returns the min-count and 'any + - # and ' should not increase the argument count. * test-suite/tests/tree-il.test (*): Tests for new parameters. --- module/language/tree-il/analyze.scm | 13 ++++++++++--- test-suite/tests/tree-il.test | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/module/language/tree-il/analyze.scm b/module/language/tree-il/analyze.scm index 88f81f3..badce9f 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -1259,11 +1259,11 @@ accurate information is missing from a given `tree-il' element." (case state ((tilde) (case (car chars) - ((#\~ #\% #\& #\t #\_ #\newline #\( #\)) + ((#\~ #\% #\& #\t #\T #\_ #\newline #\( #\) #\! #\| #\/ #\q #\Q) (loop (cdr chars) 'literal '() conditions end-group min-count max-count)) - ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\, #\: #\@) + ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\, #\: #\@ #\+ #\- #\#) (loop (cdr chars) 'tilde (cons (car chars) params) conditions end-group @@ -1330,16 +1330,23 @@ accurate information is missing from a given `tree-il' element." min-count) (+ (or (previous-number params) 1) max-count)))) - ((#\? #\k) + ((#\? #\k #\K) ;; We don't have enough info to determine the exact number ;; of args, but we could determine a lower bound (TODO). (values 'any 'any)) + ((#\^) + (values min-count 'any)) ((#\h #\H) (let ((argc (if (memq #\: params) 2 1))) (loop (cdr chars) 'literal '() conditions end-group (+ argc min-count) (+ argc max-count)))) + ((#\') + (if (null? (cdr chars)) + (throw &syntax-error 'unexpected-termination) + (loop (cddr chars) 'tilde (cons (cadr chars) params) + conditions end-group min-count max-count))) (else (loop (cdr chars) 'literal '() conditions end-group (+ 1 min-count) (+ 1 max-count))))) diff --git a/test-suite/tests/tree-il.test b/test-suite/tests/tree-il.test index 68dfc32..2217ffc 100644 --- a/test-suite/tests/tree-il.test +++ b/test-suite/tests/tree-il.test @@ -1415,11 +1415,11 @@ (number? (string-contains (car w) "wrong number of arguments"))))) - (pass-if "~%, ~~, ~&, ~t, ~_, and ~\\n" + (pass-if "~%, ~~, ~&, ~t, ~_, ~!, ~|, ~/, ~q and ~\\n" (null? (call-with-warnings (lambda () (compile '((@ (ice-9 format) format) some-port - "~&~3_~~ ~\n~12they~%") + "~&~3_~~ ~\n~12they~% ~!~|~/~q") #:opts %opts-w-format #:to 'assembly))))) @@ -1687,6 +1687,31 @@ #:opts %opts-w-format #:to 'assembly))))) + (pass-if "~^" + (null? (call-with-warnings + (lambda () + (compile '((@ (ice-9 format) format) #f "~a ~^ ~a" 0 1) + #:opts %opts-w-format + #:to 'assembly))))) + + (pass-if "~^, too few args" + (let ((w (call-with-warnings + (lambda () + (compile '((@ (ice-9 format) format) #f "~a ~^ ~a") + #:opts %opts-w-format + #:to 'assembly))))) + (and (= (length w) 1) + (number? (string-contains (car w) + "expected at least 1, got 0"))))) + + (pass-if "parameters: +,-,#, and '" + (null? (call-with-warnings + (lambda () + (compile '((@ (ice-9 format) format) some-port + "~#~ ~,,-2f ~,,+2f ~'A~" 1234 1234) + #:opts %opts-w-format + #:to 'assembly))))) + (pass-if "complex 1" (let ((w (call-with-warnings (lambda () -- 1.7.7.6