git.fiddlerwoaroof.com
Browse code

feat: support yaml-11 integers (octal, etc.)

Ed Langley authored on 30/10/2020 23:16:49
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