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
1 change: 1 addition & 0 deletions sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ sonar.python.coverage.reportPaths=coverage_for_sonarcloud.xml
sonar.python.version=3.7, 3.8, 3.9, 3.10

sonar.cpp.file.suffixes=-
sonar.c.file.suffixes=-
69 changes: 37 additions & 32 deletions string_to_code/to_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
provides string_to_c utilities
"""
from . import core
from . import utils


def atom_to_code(in_atom):
Expand All @@ -26,51 +27,55 @@ def function_call_str(in_function_name):
return f"{in_function_name}();"


def _proc_single_body_line(in_line_data):
if isinstance(in_line_data, core.Atom):
res = atom_to_code(in_line_data)
else:
res = function_call_str(in_line_data.function_name)
return " " + res


def function_to_code(in_function):
"""
returns a string representing the code of the function definiton in C
"""
assert isinstance(in_function, core.SimpleFunction)

def proc_single_body_line(in_line_data):
if isinstance(in_line_data, core.Atom):
res = atom_to_code(in_line_data)
else:
res = function_call_str(in_line_data.function_name)
return " " + res

function_body = "\n".join(
proc_single_body_line(_) for _ in in_function.called_list
_proc_single_body_line(_) for _ in in_function.called_list
)

return "\n".join(
[f"void {in_function.function_name}()", "{", function_body, "}"]
if function_body:
function_body = "\n" + function_body + "\n"

res = "\n".join(
[
f"void {in_function.function_name}()",
"{" + function_body + "}",
]
)
return res


def proc(in_str, gen_function_names=None):
"""
returns a C code printing in_str to the standard output
"""
if gen_function_names is None:
gen_function_names = core.gen_function_names()

printer_program = core.get_printer_program(in_str, gen_function_names)
function_definitions = printer_program.needed_function_definitions_str(
function_to_code, "\n\n\n"
)
if function_definitions:
function_definitions = function_definitions + "\n\n"
call_in_main_str = printer_program.initial_call_str(
atom_to_code, function_call_str
def _main_call_to_code(in_initial_call):
initial_call_str = (
_proc_single_body_line(in_initial_call) + "\n "
if in_initial_call is not None
else " "
)
if call_in_main_str:
call_in_main_str = "\n " + call_in_main_str
return f"""int main()
{{
{initial_call_str}return 0;
}}"""

res = function_definitions + "\n".join(
["int main()", "{" + call_in_main_str, " return 0;", "}", ""]
)
if call_in_main_str:
assert "putchar" in res

def _join_to_final(main_call, function_definitions):
res = "\n\n".join(function_definitions + [main_call]) + "\n"
if function_definitions or "putchar" in main_call:
res = "#include <stdio.h>\n\n" + res
return res


proc_printer_program, proc = utils.get_all_proc_functions(
_main_call_to_code, function_to_code, _join_to_final
)
16 changes: 16 additions & 0 deletions tests/example_data/c/one_empty_function.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <stdio.h>

void fun_b()
{}

void fun_a()
{
fun_b();
putchar('C');
}

int main()
{
fun_a();
return 0;
}
4 changes: 4 additions & 0 deletions tests/example_data/c/trivial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
int main()
{
return 0;
}
2 changes: 1 addition & 1 deletion tests/setup_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def get_test_data():
return gu.Language(
tool_names=[get_c_compiler(), setup_cpp.get_cppcheck()],
string_to_code=to_c.proc,
printer_program_to_code=[],
printer_program_to_code=to_c.proc_printer_program,
run_code=run_c_code,
id="c",
source_code_file_extension=_get_source_code_file_extension(),
Expand Down