Teach reader to find and respect "coding" attribute.
authorChris Hanson <org/chris-hanson/cph>
Sat, 8 Jun 2019 05:02:39 +0000 (22:02 -0700)
committerChris Hanson <org/chris-hanson/cph>
Sat, 8 Jun 2019 21:35:48 +0000 (14:35 -0700)
This allows a file to override the default utf-8 coding.

src/runtime/reader.scm

index c76b8b1dd2624ebab718fff0b2a177363134d210..5e5c28bf9770d9d90a94198bf25708c08d1a6b5d 100644 (file)
@@ -898,6 +898,7 @@ USA.
   (set-db-property! db 'reader-enable-attributes? #f)
   ;; Save all the attributes; this helps with testing.
   (set-db-property! db 'reader-file-attributes file-attribute-alist)
+  (process-coding-attribute file-attribute-alist db)
   (process-keyword-attribute file-attribute-alist db)
   (process-mode-attribute file-attribute-alist db)
   (process-studly-case-attribute file-attribute-alist db))
@@ -907,6 +908,18 @@ USA.
         (lambda (left right)
           (string-ci=? (symbol->string left) (symbol->string right)))))
 
+;;; Allow file to specify its character coding.
+(define (process-coding-attribute file-attribute-alist db)
+  (let ((entry (lookup-file-attribute file-attribute-alist 'coding)))
+    (if (pair? entry)
+        (let ((coding (cdr entry))
+              (port (db-port db)))
+          (if (and (symbol? coding) (known-input-port-coding? coding))
+              (if (and (port/supports-coding? port)
+                       (port/known-coding? port coding))
+                  (port/set-coding port coding))
+              (warn "Unrecognized value for coding:" coding))))))
+
 ;;; Look for keyword-style: prefix or keyword-style: suffix
 (define (process-keyword-attribute file-attribute-alist db)
   (let ((keyword-entry
@@ -925,7 +938,7 @@ USA.
                 (set-db-property! db 'reader-keyword-style 'suffix))
                (else
                 (warn "Unrecognized value for keyword-style" value)))))))
-
+\f
 ;;; Don't do anything with the mode, but warn if it isn't scheme.
 (define (process-mode-attribute file-attribute-alist db)
   (declare (ignore db))