shithub: fnt

Download patch

ref: f5c1a9365b39548d8346227e72def71468bbf0ba
parent: 3c6cc9377be0d201f63491f2878332a62c4dcaa2
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Jul 25 21:26:18 EDT 2024

support defininig field values as enums

--- a/gen.rkt
+++ b/gen.rkt
@@ -280,6 +280,9 @@
 (define (field-bits f)
   (field-attr f 'bits))
 
+(define (field-enum f)
+  (field-attr f 'enum))
+
 (define/contract (field-count f)
   (-> field? (or/c false/c number? string?))
   (fmt-expr (field-attr f 'count)))
@@ -300,22 +303,36 @@
   (define bits-args
     (or (and bits
              (string-join
-              (hash-map (field-bits f)
-                        (λ (bit enum)
-                          (~a "(v->" (field-name f) array-index "&" enum ")?\" " enum "\":\"\"")))
+              (hash-map bits
+                        (λ (bit ename)
+                          (~a "(v->" (field-name f) array-index "&" ename ")?\" " ename "\":\"\"")))
               ", "
               #:before-first ", "))
         ""))
+  (define enum (field-enum f))
+  (define enum-verbs (or (and enum "%s") ""))
+  (define enum-args
+    (or (and enum
+             (string-join
+              (hash-map enum
+                        (λ (val ename)
+                          (~a "v->" (field-name f) array-index "==" ename "?\" " ename "\"")))
+              ": "
+              #:before-first ", "
+              #:after-last ":\"\""))
+        ""))
   (define print-index
     (if basic-array
         (~a "f->print(f->aux, \"%*s%s[%d]: "
             verb
             bits-verbs
+            enum-verbs
             "\\n\", indent, \"\", \""
             (field-name f)
             "\", i, "
             (fmtarg (~a "v->" (field-name f) array-index))
             bits-args
+            enum-args
             ");")
         (~a "f->print(f->aux, \"%*s%s[%d]:\\n\", indent, \"\", \"" (field-name f) "\", i);")))
   (define array-loop
@@ -332,11 +349,13 @@
           (list (~a "f->print(f->aux, \"%*s%s: "
                     verb
                     bits-verbs
+                    enum-verbs
                     "\\n\", indent, \"\", \""
                     (field-name f)
                     "\", "
                     (fmtarg (~a "v->" (field-name f) array-index))
                     bits-args
+                    enum-args
                     ");")
                 (if (field-context? f) (~a "o->" (field-name f) " = v->" (field-name f) ";") empty))
           (list (if cnt
@@ -363,17 +382,25 @@
   [(define/generic super-gen-h gen-h)
    (define/generic super-gen-c gen-c)
    (define (gen-h c)
-     (define allbits
+     (define valbits
        (filter-map (λ (f)
                      (define bits (field-bits f))
                      (and bits
                           (list (~a "// " (field-name f))
-                                (hash-map bits (λ (bit enum) (~a enum " = 1<<" bit ","))))))
+                                (hash-map bits (λ (bit ename) (~a ename " = 1<<" bit ","))))))
                    (cmplx-fields c)))
+     (define valenums
+       (filter-map (λ (f)
+                     (define enum (field-enum f))
+                     (and enum
+                          (list (~a "// " (field-name f))
+                                (hash-map enum (λ (val ename) (~a ename " = " val ","))))))
+                   (cmplx-fields c)))
+     (define values (append valbits valenums))
      (define enums
-       (if (empty? allbits)
+       (if (empty? values)
            empty
-           (list (~a "enum { // " (cmplx-name c)) (indent allbits) (~a "};") (~a ""))))
+           (list (~a "enum { // " (cmplx-name c)) (indent values) (~a "};") (~a ""))))
      (flatten (append (list (~a "typedef struct " (cmplx-name c) " " (cmplx-name c) ";")
                             (~a "")
                             enums
@@ -592,6 +619,7 @@
      #''(count ref)]
     [(_ _ _ (n:number)) #''(count n)]
     [(_ _ _ ({~literal bits} ht:expr)) #'(list 'bits ht)]
+    [(_ _ _ ({~literal enum} ht:expr)) #'(list 'enum ht)]
     [(_ _ _ (p:arithop e:expr ...+)) #''(count (p e ...))])) ; FIXME - check fields and ops/numbers
 
 (define-syntax (mkfield stx)
--- a/otf.rkt
+++ b/otf.rkt
@@ -463,8 +463,19 @@
         (4 . LOOKUP_FL_USE_MARK_FILTERING_SET)))
 ; FIXME 0xff00 is attachment class filter
 
+(define lookupTypes
+  #hash((1 . LOOKUP_TYPE_SINGLE_ADJUSTMENT)
+        (2 . LOOKUP_TYPE_PAIR_ADJUSTMENT)
+        (3 . LOOKUP_TYPE_CURSIVE_ATTACHMENT)
+        (4 . LOOKUP_TYPE_MARK_TO_BASE_ATTACHMENT)
+        (5 . LOOKUP_TYPE_MARK_TO_LIGATURE_ATTACHMENT)
+        (6 . LOOKUP_TYPE_MARK_TO_MARK_ATTACHMENT)
+        (7 . LOOKUP_TYPE_CONTEXTUAL_POSITIONING)
+        (8 . LOOKUP_TYPE_CHAINED_CONTEXTS_POSITIONING)
+        (9 . LOOKUP_TYPE_POSITIONING_EXTENSION)))
+
 (mkcmplx Lookup
-         {uint16 lookupType}
+         {uint16 lookupType (enum lookupTypes)}
          {uint16 lookupFlag hex (bits lookupFlags)}
          {uint16 subTableCount}
          {Offset16 subtableOffsets [subTableCount]}
--- a/plan9/otf.c
+++ b/plan9/otf.c
@@ -3504,7 +3504,7 @@
 void
 print_Lookup(Otfile *f, int indent, Otf *o, Lookup *v)
 {
-	f->print(f->aux, "%*s%s: %ud\n", indent, "", "lookupType", v->lookupType);
+	f->print(f->aux, "%*s%s: %ud%s\n", indent, "", "lookupType", v->lookupType, v->lookupType==LOOKUP_TYPE_SINGLE_ADJUSTMENT?" LOOKUP_TYPE_SINGLE_ADJUSTMENT": v->lookupType==LOOKUP_TYPE_PAIR_ADJUSTMENT?" LOOKUP_TYPE_PAIR_ADJUSTMENT": v->lookupType==LOOKUP_TYPE_CURSIVE_ATTACHMENT?" LOOKUP_TYPE_CURSIVE_ATTACHMENT": v->lookupType==LOOKUP_TYPE_MARK_TO_BASE_ATTACHMENT?" LOOKUP_TYPE_MARK_TO_BASE_ATTACHMENT": v->lookupType==LOOKUP_TYPE_MARK_TO_LIGATURE_ATTACHMENT?" LOOKUP_TYPE_MARK_TO_LIGATURE_ATTACHMENT": v->lookupType==LOOKUP_TYPE_MARK_TO_MARK_ATTACHMENT?" LOOKUP_TYPE_MARK_TO_MARK_ATTACHMENT": v->lookupType==LOOKUP_TYPE_CONTEXTUAL_POSITIONING?" LOOKUP_TYPE_CONTEXTUAL_POSITIONING": v->lookupType==LOOKUP_TYPE_CHAINED_CONTEXTS_POSITIONING?" LOOKUP_TYPE_CHAINED_CONTEXTS_POSITIONING": v->lookupType==LOOKUP_TYPE_POSITIONING_EXTENSION?" LOOKUP_TYPE_POSITIONING_EXTENSION":"");
 	f->print(f->aux, "%*s%s: %#ux%s%s%s%s%s\n", indent, "", "lookupFlag", v->lookupFlag, (v->lookupFlag&LOOKUP_FL_RIGHT_TO_LEFT)?" LOOKUP_FL_RIGHT_TO_LEFT":"", (v->lookupFlag&LOOKUP_FL_IGNORE_BASE_GLYPHS)?" LOOKUP_FL_IGNORE_BASE_GLYPHS":"", (v->lookupFlag&LOOKUP_FL_IGNORE_LIGATURES)?" LOOKUP_FL_IGNORE_LIGATURES":"", (v->lookupFlag&LOOKUP_FL_IGNORE_MARKS)?" LOOKUP_FL_IGNORE_MARKS":"", (v->lookupFlag&LOOKUP_FL_USE_MARK_FILTERING_SET)?" LOOKUP_FL_USE_MARK_FILTERING_SET":"");
 	f->print(f->aux, "%*s%s: %ud\n", indent, "", "subTableCount", v->subTableCount);
 	for(int i = 0; i < v->subTableCount; i++)
--- a/plan9/otf.h
+++ b/plan9/otf.h
@@ -925,6 +925,16 @@
 	LOOKUP_FL_IGNORE_LIGATURES = 1<<2,
 	LOOKUP_FL_IGNORE_MARKS = 1<<3,
 	LOOKUP_FL_USE_MARK_FILTERING_SET = 1<<4,
+	// lookupType
+	LOOKUP_TYPE_SINGLE_ADJUSTMENT = 1,
+	LOOKUP_TYPE_PAIR_ADJUSTMENT = 2,
+	LOOKUP_TYPE_CURSIVE_ATTACHMENT = 3,
+	LOOKUP_TYPE_MARK_TO_BASE_ATTACHMENT = 4,
+	LOOKUP_TYPE_MARK_TO_LIGATURE_ATTACHMENT = 5,
+	LOOKUP_TYPE_MARK_TO_MARK_ATTACHMENT = 6,
+	LOOKUP_TYPE_CONTEXTUAL_POSITIONING = 7,
+	LOOKUP_TYPE_CHAINED_CONTEXTS_POSITIONING = 8,
+	LOOKUP_TYPE_POSITIONING_EXTENSION = 9,
 };
 
 struct Lookup {