Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib_test/_tags
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
true: syntax(camlp4o), package(cstruct.syntax), package(cstruct), package(bigarray)
true: syntax(camlp4o), package(cstruct.syntax), package(cstruct), package(bigarray), package(unix)
true: annot
6 changes: 5 additions & 1 deletion lib_test/enum.ml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ cenum foo64 {

cenum foo32 {
ONE32;
TWO32;
TWO32 = 3;
THREE32
} as uint32_t

Expand All @@ -47,4 +47,8 @@ let _ =
ignore(foo32_to_int ONE32);
ignore(foo16_to_int ONE16);
ignore(foo8_to_int ONE8);
assert(foo32_to_int TWO32 = 3l);
assert(foo32_to_int THREE32 = 1l);
assert(foo32_of_int 3l = Some (TWO32));
assert(foo32_of_int 1l = Some (THREE32));
print_endline (foo8_to_string ONE8)
24 changes: 16 additions & 8 deletions syntax/pa_cstruct.ml
Original file line number Diff line number Diff line change
Expand Up @@ -173,18 +173,15 @@ let output_enum _loc name fields width =
(fun i -> <:patt< $int64:string_of_int i$ >>)
|Some (Buffer _) -> loc_err _loc "enum: array types not allowed"
in
let decls = tyOr_of_list (List.map (fun f ->
let decls = tyOr_of_list (List.map (fun (f,_) ->
<:ctyp< $uid:f$ >>) fields) in
let mapi fn l =
let ctr = ref 0 in
List.map (fun x -> let r = fn !ctr x in incr ctr; r) l in
let getters = mcOr_of_list ((mapi (fun i f ->
let getters = mcOr_of_list ((List.map (fun (f,i) ->
<:match_case< $pattfn i$ -> Some $uid:f$ >>
) fields) @ [ <:match_case< _ -> None >> ]) in
let setters = mcOr_of_list (mapi (fun i f ->
let setters = mcOr_of_list (List.map (fun (f,i) ->
<:match_case< $uid:f$ -> $intfn i$ >>
) fields) in
let printers = mcOr_of_list (mapi (fun i f ->
let printers = mcOr_of_list (List.map (fun (f,_) ->
<:match_case< $uid:f$ -> $str:f$ >>) fields) in
let getter x = sprintf "%s_of_int" x in
let setter x = sprintf "%s_to_int" x in
Expand All @@ -211,13 +208,24 @@ EXTEND Gram
]
];

constr_enum: [
[ f = UIDENT -> (f, None)
| f = UIDENT; "="; i = INT -> (f, Some (int_of_string i)) ]
];

str_item: [
[ "cstruct"; name = LIDENT; fields = constr_fields;
"as"; endian = LIDENT ->
output_struct _loc (create_struct _loc endian name fields)
] |
[ "cenum"; name = LIDENT; "{"; fields = LIST0 [ f = UIDENT -> f ] SEP ";"; "}";
[ "cenum"; name = LIDENT; "{"; fields = LIST0 [ constr_enum ] SEP ";"; "}";
"as"; width = LIDENT ->
let n = ref (-1) in
let fields =
List.map (function
| (f, None) -> incr n; (f, !n)
| (f, Some i) -> (f, i)
) fields in
output_enum _loc name fields width
]
];
Expand Down