Support for multiple functions in declarator, size_t fixes

This commit is contained in:
Ganesh Viswanathan 2019-01-09 17:08:04 -06:00
commit 4d57be55ac
3 changed files with 35 additions and 16 deletions

View file

@ -51,8 +51,8 @@ proc saveNodeData(node: TSNode): bool =
gStateRT.data[^1].val = "ptr " & gStateRT.data[^1].val.getIdentifier() gStateRT.data[^1].val = "ptr " & gStateRT.data[^1].val.getIdentifier()
if gStateRT.data[^1].val == "ptr char": if gStateRT.data[^1].val == "ptr char":
gStateRT.data[^1].val = "cstring" gStateRT.data[^1].val = "cstring"
elif name == "field_declaration": elif name in ["field_declaration", "function_declarator"]:
gStateRT.data.add(("field_declaration", "")) gStateRT.data.add((name, ""))
return true return true

View file

@ -56,6 +56,8 @@ proc getType*(str: string): string =
("unsigned ", "cu"), ("unsigned ", "cu"),
("double ", "cdouble"), ("double ", "cdouble"),
("long ", "clong"), ("long ", "clong"),
("ssize_t", "int"),
("size_t", "uint")
]). ]).
replace(re"([u]?int[\d]+)_t", "$1"). replace(re"([u]?int[\d]+)_t", "$1").
replace(re"([u]?int)ptr_t", "ptr $1") replace(re"([u]?int)ptr_t", "ptr $1")

View file

@ -120,6 +120,10 @@ proc initGrammar() =
i += 3 i += 3
while i < gStateRT.data.len-fend: while i < gStateRT.data.len-fend:
if gStateRT.data[i].name == "function_declarator":
i += 1
continue
if gStateRT.data[i].name == "field_declaration": if gStateRT.data[i].name == "field_declaration":
break break
@ -284,7 +288,7 @@ proc initGrammar() =
)) ))
let funcGrammar = &""" let funcGrammar = &"""
(function_declarator? (function_declarator*
(identifier) (identifier)
{paramListGrammar} {paramListGrammar}
) )
@ -296,7 +300,11 @@ proc initGrammar() =
(storage_class_specifier?) (storage_class_specifier?)
{typeGrammar} {typeGrammar}
{funcGrammar} {funcGrammar}
(pointer_declarator? (pointer_declarator*
{funcGrammar}
)
{funcGrammar}
(pointer_declarator*
{funcGrammar} {funcGrammar}
) )
) )
@ -304,27 +312,36 @@ proc initGrammar() =
proc (ast: ref Ast, node: TSNode) = proc (ast: ref Ast, node: TSNode) =
let let
ftyp = gStateRT.data[0].val.getIdentifier() ftyp = gStateRT.data[0].val.getIdentifier()
fname = gStateRT.data[1].val
fnname = fname.getIdentifier()
if fnname notin gStateRT.procs: var
i = 1
while i < gStateRT.data.len:
if gStateRT.data[i].name == "function_declarator":
i += 1
continue
var var
fname = gStateRT.data[i].val
fnname = fname.getIdentifier()
pout, pname, ptyp = "" pout, pname, ptyp = ""
i = 2
count = 1 count = 1
if gStateRT.data.len > 2: i += 1
while i < gStateRT.data.len: while i < gStateRT.data.len:
funcParamCommon(pname, ptyp, pout, count, i) if gStateRT.data[i].name == "function_declarator":
break
funcParamCommon(pname, ptyp, pout, count, i)
if pout.len != 0 and pout[^1] == ',': if pout.len != 0 and pout[^1] == ',':
pout = pout[0 .. ^2] pout = pout[0 .. ^2]
gStateRT.procs.add(fnname) if fnname notin gStateRT.procs:
if ftyp != "object": gStateRT.procs.add(fnname)
gStateRT.procStr &= &"proc {fnname}({pout}): {ftyp} {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n" if ftyp != "object":
else: gStateRT.procStr &= &"proc {fnname}({pout}): {ftyp} {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n"
gStateRT.procStr &= &"proc {fnname}({pout}) {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n" else:
gStateRT.procStr &= &"proc {fnname}({pout}) {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n"
)) ))