#!/usr/bin/python3 import glob import re import sys def map_defines(file, dmap): with open(file, 'rt') as fd: for line in fd: match = re.match(r"#\s*define\s+(SLAPI[A-Z0-9_]*)\s+([A-Z0-9_]+)", line) if match: dmap[match.group(1)] = match.group(2) def dn2v(dn): v = dmap[dn] while not re.match('[0-9]', v): v = dmap[v] return v FORMAT = { 'g': 'int\n%s(Slapi_PBlock *pblock, int arg, void *value)\n{', 's': 'int\n%s(Slapi_PBlock *pblock, int arg, void *value)\n{', } ARRAY_SIZE = 10000 funcs=[] array={} for state in ('g','s'): array[state] = [ f'slapi_pb{state}_none' for i in range(ARRAY_SIZE) ] def dn2n(dn,state): return f'slapi_pb{state}_{dn.lower()[6:]}' def resolve(state, dn, code): global vmax global funcs global array v = int(dn2v(dn)) fname = dn2n(dn,state) array[state][v] = fname if code: funcs.append('\n') funcs.append(FORMAT[state]%fname) funcs.extend(code) funcs.append(' return 0;\n}') def parse_pblock(): state = None code = None with open('pblock.c', 'rt') as fd: for line in fd: line = line.rstrip() if line.startswith('}'): state = None code = None match = re.match('slapi_pblock_([gs])et', line) if match: state = match.group(1) continue match = re.match(r"\s*case\s+([A-Z0-9_]+):", line) if match: dn = match.group(1) code = [] continue match = re.match(r"\s*break;", line) if match: resolve(state, dn, code) code = None if code is not None: code.append(line[4:]) dmap = {} for file in glob.glob("*.h"): map_defines(file, dmap) map_defines('pblock.c', dmap) parse_pblock() for l in funcs: print(l) print('\nPBLOCK_TABLE pblock_table[] = {') for n in range(ARRAY_SIZE): print(' /* %05d */ { %s, %s },'%(n, array['g'][n], array['s'][n])) print('};')