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 {