|
|
@ -12,41 +12,8 @@ tstylesheet { |
|
|
|
// pEpACIDLang IG-C99 |
|
|
|
// The C99 Interface Generator for pEpACIDLang |
|
|
|
// ---------------------------------------------------------------------- |
|
|
|
|
|
|
|
// typeclass is either |
|
|
|
// * primitive |
|
|
|
// * object |
|
|
|
def "func:ig_c99_typeclass" { |
|
|
|
param "idltype"; |
|
|
|
const "resolved_type", "func:idl_type_get_resolved_type($idltype)"; |
|
|
|
const "resolved_typekind", "func:idl_type_get_typekind_of_type($resolved_type)"; |
|
|
|
|
|
|
|
choose { |
|
|
|
when "func:idl_type_is_defined($idltype)" |
|
|
|
choose { |
|
|
|
when "$resolved_typekind = 'basetype'" |
|
|
|
choose { |
|
|
|
when "$resolved_type = 'string'" |
|
|
|
result > object |
|
|
|
when "$resolved_type = 'binary'" |
|
|
|
result > object |
|
|
|
otherwise |
|
|
|
result > primitive |
|
|
|
} |
|
|
|
when "$resolved_typekind = 'enum'" |
|
|
|
result > primitive |
|
|
|
when "$resolved_typekind = 'struct'" |
|
|
|
result > object |
|
|
|
when "$resolved_typekind = 'generic'" |
|
|
|
result > object |
|
|
|
otherwise |
|
|
|
error > ig_c99_typeclass - cant determine typeclass of: «$idltype» |
|
|
|
} |
|
|
|
otherwise |
|
|
|
error > ig_c99_typeclass - is not a type: «$idltype» |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
// generate basetype declarations defined by the idl |
|
|
|
|
|
|
|
template "idl" document "ig-c99/idl_core.h", "text" { |
|
|
|
|| |
|
|
@ -67,6 +34,16 @@ tstylesheet { |
|
|
|
|| |
|
|
|
} |
|
|
|
|
|
|
|
template "basetypes" { |
|
|
|
for "*" { |
|
|
|
const "name", "name()"; |
|
|
|
if "func:c99_typename_of_basetype($name) != $name" { |
|
|
|
> «func:typedef(func:c99_typename_of_basetype($name), $name)» |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
template "api" document "ig-c99/{@name}_api.h", "text" { |
|
|
|
const "pkg_name", "../@name"; |
|
|
|
const "pkg_version", "../version/text()"; |
|
|
@ -108,16 +85,8 @@ tstylesheet { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// TYPEALIAS |
|
|
|
// --------- |
|
|
|
|
|
|
|
def "func:typedef" { |
|
|
|
param "is_type"; |
|
|
|
param "alias_name"; |
|
|
|
result > typedef «$is_type» «$alias_name»;\n |
|
|
|
} |
|
|
|
|
|
|
|
def "func:idltype_to_ctype_basetype" { |
|
|
|
def "func:c99_typename_of_basetype" { |
|
|
|
param "idltype"; |
|
|
|
|
|
|
|
// TODO: test for is_basetype |
|
|
@ -137,10 +106,69 @@ tstylesheet { |
|
|
|
when "$idltype = 'bool'" |
|
|
|
result > bool |
|
|
|
otherwise |
|
|
|
error > func:idltype_to_ctype_basetype - basetype not supported by ig-c99: «$idltype» |
|
|
|
error > func:c99_typename_of_basetype - basetype not supported by ig-c99: «$idltype» |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
def "func:c99_typename_of_enum" { |
|
|
|
param "name"; |
|
|
|
param "pkg_name"; |
|
|
|
|
|
|
|
result "yml:ucase(concat($pkg_name, '_', $name))"; |
|
|
|
} |
|
|
|
|
|
|
|
def "func:c99_itemname_of_enumitem" { |
|
|
|
param "enum_name"; |
|
|
|
param "idl_item_name"; |
|
|
|
|
|
|
|
result "yml:ucase(concat($enum_name, '_', $idl_item_name))"; |
|
|
|
} |
|
|
|
|
|
|
|
def "func:c99_typename_of_struct" { |
|
|
|
param "pkg_name"; |
|
|
|
param "idl_name"; |
|
|
|
|
|
|
|
result "concat(yml:capit($pkg_name), '_', yml:capit($idl_name))"; |
|
|
|
} |
|
|
|
|
|
|
|
// typeclass is either |
|
|
|
// * primitive |
|
|
|
// * object |
|
|
|
def "func:c99_typeclass_of_type" { |
|
|
|
param "idltype"; |
|
|
|
const "resolved_type", "func:idl_type_get_resolved_type($idltype)"; |
|
|
|
const "resolved_typekind", "func:idl_type_get_typekind_of_type($resolved_type)"; |
|
|
|
|
|
|
|
choose { |
|
|
|
when "func:idl_type_is_defined($idltype)" |
|
|
|
choose { |
|
|
|
when "$resolved_typekind = 'basetype'" |
|
|
|
choose { |
|
|
|
when "$resolved_type = 'string'" |
|
|
|
result > object |
|
|
|
when "$resolved_type = 'binary'" |
|
|
|
result > object |
|
|
|
otherwise |
|
|
|
result > primitive |
|
|
|
} |
|
|
|
when "$resolved_typekind = 'enum'" |
|
|
|
result > primitive |
|
|
|
when "$resolved_typekind = 'struct'" |
|
|
|
result > object |
|
|
|
when "$resolved_typekind = 'generic'" |
|
|
|
result > object |
|
|
|
otherwise |
|
|
|
error > c99_typeclass_of_type - cant determine typeclass of: «$idltype» |
|
|
|
} |
|
|
|
otherwise |
|
|
|
error > c99_typeclass_of_type - is not a type: «$idltype» |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
// TYPEALIAS |
|
|
|
// --------- |
|
|
|
|
|
|
|
template "deftype" { |
|
|
|
const "alias_name", "@name"; |
|
|
|
const "type_or_typekind", "as/@type"; |
|
|
@ -158,13 +186,10 @@ tstylesheet { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
template "basetypes" { |
|
|
|
for "*" { |
|
|
|
const "name", "name()"; |
|
|
|
if "func:idltype_to_ctype_basetype($name) != $name" { |
|
|
|
> «func:typedef(func:idltype_to_ctype_basetype($name), $name)» |
|
|
|
} |
|
|
|
} |
|
|
|
def "func:typedef" { |
|
|
|
param "is_type"; |
|
|
|
param "alias_name"; |
|
|
|
result > typedef «$is_type» «$alias_name»;\n |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -172,13 +197,6 @@ tstylesheet { |
|
|
|
// ENUM |
|
|
|
// ---- |
|
|
|
|
|
|
|
def "func:idltype_to_ctype_enum" { |
|
|
|
param "pkg_name"; |
|
|
|
param "name"; |
|
|
|
|
|
|
|
result "yml:ucase(concat($pkg_name, '_', $name))"; |
|
|
|
} |
|
|
|
|
|
|
|
function "enums" { |
|
|
|
|| |
|
|
|
// Enums |
|
|
@ -197,7 +215,7 @@ tstylesheet { |
|
|
|
function "enum" { |
|
|
|
param "idl_enum_name"; |
|
|
|
param "idl_pkg_name"; |
|
|
|
const "enum_name", "func:idltype_to_ctype_enum($idl_pkg_name, $idl_enum_name)"; |
|
|
|
const "enum_name", "func:c99_typename_of_enum($idl_enum_name, $idl_pkg_name)"; |
|
|
|
|| |
|
|
|
typedef enum _«$enum_name» { |
|
|
|
``apply "item" with "enum_name", "$enum_name" |
|
|
@ -209,7 +227,7 @@ tstylesheet { |
|
|
|
template "item" { |
|
|
|
param "enum_name"; |
|
|
|
const "idl_item_name", "@name"; |
|
|
|
const "c99_item_name", "yml:ucase(concat($enum_name, '_', $idl_item_name))"; |
|
|
|
const "c99_item_name", "func:c99_itemname_of_enumitem($enum_name, $idl_item_name)"; |
|
|
|
const "idl_value", "text()"; |
|
|
|
const "c99_value", "func:enum_item_value($idl_value)"; |
|
|
|
|
|
|
@ -231,17 +249,19 @@ tstylesheet { |
|
|
|
// STRUCT |
|
|
|
// ------ |
|
|
|
|
|
|
|
def "func:idltype_to_ctype_struct" { |
|
|
|
param "pkg_name"; |
|
|
|
param "idl_name"; |
|
|
|
function "structs" { |
|
|
|
|| |
|
|
|
// Structs |
|
|
|
// ------- |
|
|
|
|
|
|
|
result "concat(yml:capit($pkg_name), '_', yml:capit($idl_name))"; |
|
|
|
``apply "struct" |
|
|
|
|| |
|
|
|
} |
|
|
|
|
|
|
|
template "struct" { |
|
|
|
const "idl_name", "@name"; |
|
|
|
const "pkg_name", "../../@name"; |
|
|
|
const "c_name", "func:idltype_to_ctype_struct($pkg_name, $idl_name)"; |
|
|
|
const "c_name", "func:c99_typename_of_struct($pkg_name, $idl_name)"; |
|
|
|
|| |
|
|
|
typedef struct _«$c_name» { |
|
|
|
``apply "field" |
|
|
@ -282,7 +302,7 @@ tstylesheet { |
|
|
|
def "func:idlparam_to_cparam" { |
|
|
|
param "idltype"; |
|
|
|
param "mode"; |
|
|
|
const "typeclass", "func:ig_c99_typeclass($idltype)"; |
|
|
|
const "typeclass", "func:c99_typeclass_of_type($idltype)"; |
|
|
|
|
|
|
|
choose { |
|
|
|
when "$mode = 'borrow'" |
|
|
|