Select Git revision
Forked from
Anders Blomdell / LabComm
Source project has a limited visibility.
relay_gen_c.py 3.03 KiB
#!/usr/bin/python
import re
import sys
def split_match(pattern, multiline):
def match(s):
m = re.match(pattern, s)
if m:
return m.group(1)
pass
return filter(lambda s: s != None, map(match, multiline.split('\n')))
if __name__ == '__main__':
f = open(sys.argv[1])
sample = []
for l in map(lambda s: s.strip(), f):
lang,kind,func,arg,stype = l[1:].split(l[0])
if lang == 'C' and kind == 'sample':
sample.append((func, arg, stype))
pass
pass
result = []
result.extend(split_match('^[^|]*\|(.*)$', """
|// generated by relay_gen_c.py
|#include <sys/types.h>
|#include <sys/stat.h>
|#include <fcntl.h>
|#include <labcomm.h>
|#include <labcomm_default_error_handler.h>
|#include <labcomm_default_memory.h>
|#include <labcomm_default_scheduler.h>
|#include <labcomm_fd_reader.h>
|#include <labcomm_fd_writer.h>
|#include "c_code.h"
"""))
for func,arg,stype in sample:
result.extend(split_match('^[^|]*\|(.*)$', """
|void handle_%(func)s(%(arg)s *v, void *context)
|{
| struct labcomm_encoder *e = context;
| labcomm_encode_%(func)s(e%(valargstr)s);
|}""" % { 'func': func, 'arg': arg, 'valargstr': '' if stype == "void" else', v' }))
# result.extend(split_match('^[^|]*\|(.*)$', """
# |void handle_%(func)s(%(arg)s *v, void *context)
# |{
# | struct labcomm_encoder *e = context;
# | labcomm_encode_%(func)s(e, v);
# |}""" % { 'func': func, 'arg': arg }))
pass
result.extend(split_match('^[^|]*\|(.*)$', """
|int main(int argc, char *argv[]) {
| struct labcomm_encoder *e;
| struct labcomm_decoder *d;
| int in, out;
|
| if (argc < 3) { return 1; }
| in = open(argv[1], O_RDONLY);
| if (in < 0) { return 1; }
| out = open(argv[2], O_WRONLY);
| if (out < 0) { return 1; }
| e = labcomm_encoder_new(labcomm_fd_writer_new(
| labcomm_default_memory, out, 1),
| labcomm_default_error_handler,
| labcomm_default_memory,
| labcomm_default_scheduler);
| d = labcomm_decoder_new(labcomm_fd_reader_new(
| labcomm_default_memory, in, 1),
| labcomm_default_error_handler,
| labcomm_default_memory,
| labcomm_default_scheduler);
"""))
for func,arg,stype in sample:
result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm_encoder_register_%(func)s(e);
| labcomm_decoder_register_%(func)s(d, handle_%(func)s, e);
""" % { 'func': func, 'arg': arg }))
result.extend(split_match('^[^|]*\|(.*)$', """
| labcomm_decoder_run(d);
| return 0;
|}
"""))
print "\n".join(result)
pass