Support for multiple functions in declarator, size_t fixes
This commit is contained in:
parent
d21017ac5b
commit
4d57be55ac
3 changed files with 35 additions and 16 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue