Skip to content
Snippets Groups Projects
Verified Commit 599a914e authored by rahix's avatar rahix
Browse files

feat(api-demo): First code

parent 2b567d0b
No related branches found
No related tags found
No related merge requests found
#ifndef _API_H
#define _API_H
#ifndef API
# define API(id, def) def
#endif
#define API_FOO 0x35c3
API(API_FOO, void foo(short x, int y, char z, int w));
#define API_BAR 0xc0ffee
API(API_BAR, void bar(char*astr));
typedef struct {
int foo;
int bar;
int baz;
} qux_t;
#define API_QUX 0xCCC
API(API_QUX, void qux(qux_t q));
#endif /* _API_H */
import argparse
import contextlib
import os
import re
import subprocess
def main():
parser = argparse.ArgumentParser(
description="Generate the API stubs from a header file."
)
parser.add_argument(
"-H", "--header", required=True, help="The header to base the definitions on."
)
parser.add_argument(
"-c", "--client", required=True, help="The output client-side c source file."
)
parser.add_argument(
"-s", "--server", required=True, help="The output server-side c source file."
)
args = parser.parse_args()
with contextlib.ExitStack() as cx:
# Run the preprocessor on the header file to get the API definitions.
#
# For this, we first need a source to include the header which contains
# an alternative definition of the `API` macro that marks definitions in
# a way we can find later on.
api_src = """\
#define API(id, def) __GENERATE_API $ __GEN_ID_##id $ def $
#include "{header}"
""".format(
header=os.path.relpath(args.header)
)
# Evaluate the preprocessor
source = subprocess.check_output(
["gcc", "-E", "-"], input=api_src.encode()
).decode()
# Parse the header for API definitions
matcher = re.compile(
r"__GENERATE_API \$ __GEN_ID_(?P<id>\w+) \$ (?P<decl>.+?)\((?P<args>.*?)\) \$",
re.DOTALL | re.MULTILINE,
)
args_matcher = re.compile(r"(?P<type>\w+(?:\*+|\s+))(?P<name>\w+),")
# Open output files
f_client = cx.enter_context(open(args.client, "w"))
f_server = cx.enter_context(open(args.server, "w"))
print('#include "{}"\n'.format(args.header))
for match in matcher.finditer(source):
api_id = match.group("id")
api_decl = match.group("decl")
api_args = match.group("args")
api_args_names = []
api_args_types = []
api_args_sizes = []
# Destructure args
for match in args_matcher.finditer(api_args + ","):
arg_type = match.group("type").strip()
arg_name = match.group("name")
api_args_names.append(arg_name)
api_args_types.append(arg_type)
api_args_sizes.append("sizeof({})".format(arg_type))
print(
"""\
/* Autogenerated stub for {id} */
{cdecl}({cargs}) {{
const int size = {total_size};
unsigned char buffer[size];
""".format(
id=api_id,
cdecl=api_decl,
cargs=api_args,
total_size=" + ".join(api_args_sizes),
)
)
for i, (arg, ty) in enumerate(zip(api_args_names, api_args_types)):
print(
""" *({type}*)(buffer + {offset}) = {arg};""".format(
type=ty,
offset=" + ".join(api_args_sizes[:i]) if i > 0 else "0",
arg=arg,
)
)
print(
"""
printf("{id}: ");
for (int i = 0; i < size; i++) {{
printf("0x%02x ", buffer[i]);
}}
printf("\\n");
}}
""".format(
id=api_id
)
)
if __name__ == "__main__":
main()
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "card10.h"
#include "tmr_utils.h"
int main(void)
{
int count = 0;
card10_init();
card10_diag();
printf("API Test.\n");
while(1) {
printf("count = %d\n", count++);
TMR_Delay(MXC_TMR0, SEC(1), 0);
}
}
name = 'api-demo'
executable(
name + '.elf',
'main.c',
dependencies: [libcard10, max32665_startup],
link_whole: [max32665_startup_lib, board_card10_lib],
link_args: [
'-Wl,-Map=' + meson.current_build_dir() + '/' + name + '.map',
],
)
subdir('api-demo/')
subdir('bmatest/') subdir('bmatest/')
subdir('bmetest/') subdir('bmetest/')
subdir('dual-core/') subdir('dual-core/')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment