You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pEpEngine/api/to_c.ysl2

106 lines
3.1 KiB

4 years ago
// p≡p API C data types mapping
// Copyleft (c) 2019, p≡p foundation
4 years ago
// this file is under GNU General Public License 3.0
// see LICENSE.txt
// written by Volker Birk
template "*", mode=name {
param "abbr", "false()";
if ".!=/*" {
apply "..", 0, mode=name;
3 years ago
if "@name!='basic' and @name != string(../@name)"
> _
}
3 years ago
if "@name!='basic' and @name != string(../@name)"
> «@name»
}
function "name" {
param "abbr", "false()";
apply ".", mode=name with "abbr", "$abbr";
}
def "func:name" {
param "abbr", "false()";
result call "name" with "abbr", "$abbr";
}
4 years ago
def "func:basetype" {
param "type";
const "definition", "//type[@name=$type]";
choose {
when "$definition/extends"
result "func:c-type($definition/extends/@type)";
otherwise
result "func:c-type($type)";
}
}
def "func:c-type" {
param "dsltype";
3 years ago
4 years ago
choose {
3 years ago
// base types
3 years ago
when "$dsltype = 'string'"
result > char *
when "$dsltype = 'binary'"
3 years ago
result > char *
when "$dsltype = 'int'"
result > int
3 years ago
when "$dsltype = 'unsigned'"
result > unsigned int
3 years ago
when "$dsltype = 'size_t'"
result > size_t
when "$dsltype = 'bool'"
result > bool
3 years ago
when "$dsltype = 'timestamp'"
result > timestamp
when "$dsltype = 'any'"
result > void *
3 years ago
// basic type definitions
when "/package/package[@name='basic']/type[@name=$dsltype]"
result > «$dsltype»
3 years ago
when "/package/package[@name='basic']/struct[@name=$dsltype]"
result > pEp_«$dsltype»
when "/package/package[@name='basic']/enum[@name=$dsltype]"
result > pEp_«$dsltype»
// definitions in local module
when "../../type[@name=$dsltype]"
for "../../type[@name=$dsltype]"
result > «$dsltype»
when "../../struct[@name=$dsltype]"
for "../../struct[@name=$dsltype]"
result > «func:name()»
when "../../enum[@name=$dsltype]"
for "../../enum[@name=$dsltype]"
result > «func:name()»
// definitions in other module
when "/package/package/type[@name=$dsltype]"
for "/package/package/type[@name=$dsltype]" {
warning value "concat('WARNING: type ', $dsltype, ' found in non-local module')";
result > «$dsltype»
}
when "/package/package/struct[@name=$dsltype]"
for "/package/package/struct[@name=$dsltype]" {
warning value "concat('WARNING: type ', $dsltype, ' found in non-local module')";
result > «func:name()»
}
when "/package/package/enum[@name=$dsltype]"
for "/package/package/enum[@name=$dsltype]" {
warning value "concat('WARNING: type ', $dsltype, ' found in non-local module')";
result > «func:name()»
}
3 years ago
// other
4 years ago
otherwise
3 years ago
error value "concat('type “', $dsltype, '” not found')";
4 years ago
}
}