Browse code
feat: support yaml-11 integers (octal, etc.)
Ed Langley authored on 30/10/2020 23:16:49
Showing 2 changed files
Showing 2 changed files
... | ... |
@@ -1,7 +1,7 @@ |
1 | 1 |
(in-package :cl-user) |
2 | 2 |
(defpackage yaml.scalar |
3 | 3 |
(:use :cl) |
4 |
- (:export :parse-scalar) |
|
4 |
+ (:export :parse-scalar :*yaml-11-integers*) |
|
5 | 5 |
(:documentation "Parser for scalar values.")) |
6 | 6 |
(in-package :yaml.scalar) |
7 | 7 |
|
... | ... |
@@ -50,6 +50,17 @@ |
50 | 50 |
(ppcre:create-scanner "^-(\\.inf|\\.Inf|\\.INF)$")) |
51 | 51 |
|
52 | 52 |
;;; The actual parser |
53 |
+(defvar *yaml-11-integers* nil) |
|
54 |
+ |
|
55 |
+(defun parse-yaml-integer (string) |
|
56 |
+ (if (and *yaml-11-integers* |
|
57 |
+ (eql #\0 (elt string 0))) |
|
58 |
+ (if (every (lambda (it) |
|
59 |
+ (member it '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7))) |
|
60 |
+ string) |
|
61 |
+ (parse-integer string :radix 8) |
|
62 |
+ string) |
|
63 |
+ (parse-integer string))) |
|
53 | 64 |
|
54 | 65 |
(defun parse-scalar (string &optional (style :plain-scalar-style)) |
55 | 66 |
"Parse a YAML scalar string into a Lisp scalar value." |
... | ... |
@@ -67,7 +78,7 @@ |
67 | 78 |
+false+) |
68 | 79 |
;; Integers |
69 | 80 |
((ppcre:scan +integer-scanner+ string) |
70 |
- (parse-integer string)) |
|
81 |
+ (parse-yaml-integer string)) |
|
71 | 82 |
((ppcre:scan +octal-integer-scanner+ string) |
72 | 83 |
(parse-integer (subseq string 2) :radix 8)) |
73 | 84 |
((ppcre:scan +hex-integer-scanner+ string) |
... | ... |
@@ -9,6 +9,8 @@ |
9 | 9 |
(:import-from :yaml.emitter |
10 | 10 |
:emit-object |
11 | 11 |
:print-scalar) |
12 |
+ (:import-from :yaml.scalar |
|
13 |
+ :*yaml-11-integers*) |
|
12 | 14 |
(:export :parse |
13 | 15 |
:emit |
14 | 16 |
:emit-to-string |
... | ... |
@@ -16,7 +18,8 @@ |
16 | 18 |
:register-sequence-converter |
17 | 19 |
:register-mapping-converter |
18 | 20 |
:emit-object |
19 |
- :print-scalar) |
|
21 |
+ :print-scalar |
|
22 |
+ :*yaml-11-integers*) |
|
20 | 23 |
(:documentation "The main YAML interface.")) |
21 | 24 |
(in-package :yaml) |
22 | 25 |
|