#!/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 = l[1:].split(l[0])
        if lang == 'C' and kind == 'sample':
            sample.append((func, arg))
            pass
        pass
    result = []
    result.extend(split_match('^[^|]*\|(.*)$', """
      |#include <sys/types.h>
      |#include <sys/stat.h>
      |#include <fcntl.h>
      |#include <labcomm.h>
      |#include <labcomm_fd_reader.h>
      |#include <labcomm_fd_writer.h>
      |#include "c_code.h"
    """))
    for func,arg 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, 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, &out, NULL, NULL);
      |  d = labcomm_decoder_new(labcomm_fd_reader, &in, NULL, NULL);
    """))
    for func,arg 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