Skip to content
Snippets Groups Projects
Select Git revision
5 results Searching

test.sh

Blame
  • 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