#!/usr/bin/python """A program to convert printf statements to efficient serial commands.""" code = {} code["print_hex_char"] = """void print_hex_char(char p) { char d = p >> 4; if(d >= 10) d += ('a' - 10); else d += ('0' - 0); putc(d); d = p & 0xf; if(d >= 10) d += ('a' - 10); else d += ('0' - 0); putc(d); } """ code["print_decimal_char"] = """void print_decimal_uchar(unsigned char p) { char d = '0'; while(p >= 100) { p -= 100; d++; } putc(d); d = '0'; while(p >= 10) { p -= 10; d++; } putc(d); d = '0' + p; putc(d); } void print_decimal_char(char p) { char d = '0'; if(p < 0) { p = -p; putc('-'); } print_decimal_uchar((unsigned char)p); } """ code["print_newline"] = """void print_newline() { putc('\n'); putc('\r'); } """ def output_char(c): return "putc(%d);" % ord(c) def generate_printf(s, p): o = "" needed = {} params = p while(s): c = s[0] if(c != '%'): o = o + output_char(c) + '\n' s = s[1:] else: if(s[1] == 'd'): o = o + "print_decimal_char(%s)\n" % params[0] params = params[1:] needed["print_decimal_char"] = 1 s = s[2:] elif(s[1] == 'x'): o = o + "print_hex_char(%s)\n" % params[0] params = params[1:] s = s[2:] needed["print_hex_char"] = 1 for i in needed.keys(): print code[i] print o import re def recognise_printf(s): m = re.match('printf\s*\("([^"]*)"\s*,\s*(.*)\)\s*;', s) n = re.split("\s*,\s*", m.group(2)) generate_printf(m.group(1), n); recognise_printf('printf("hello world! %d %x\n", alpha, beta);');