#!/usr/bin/env python3 entities = [ [ '', '�' ], [ '\t', ' ' ], [ '\n', ' ' ], [ '\r', ' ' ], [ '"', '"' ], [ '&', '&' ], [ '<', '<' ], [ '>', '>' ], ] offset = [ None ] * 128 def gen_content(out): pos = 0 r = '' for rec in entities: char, repl = rec if char: offset[ord(char)] = pos if pos % 12 == 0: r += '\n ' else: r += ' ' r += '%3d,' % len(repl) pos += 1 for c in repl: if pos % 12 == 0: r += '\n ' else: r += ' ' r += "'%s'," % c pos += 1 out.write('static const char xmlEscapeContent[] = {%s\n};\n\n' % r) def gen_tab(out, name, escape, is_xml): r = '' for i in range(0x80): if chr(i) in escape: v = offset[i] elif i == 0: v = 0 elif is_xml and i < 32 and i != 9 and i != 10: v = 0 else: v = -1 if i % 16 == 0: r += '\n ' else: r += ' ' r += '%2d,' % v out.write('static const signed char %s[128] = {%s\n};\n\n' % (name, r)) with open('codegen/escape.inc', 'w') as out: gen_content(out) gen_tab(out, 'xmlEscapeTab', '\r&<>', True) gen_tab(out, 'xmlEscapeTabQuot', '\r"&<>', True) gen_tab(out, 'xmlEscapeTabAttr', '\t\n\r"&<>', True) out.write('#ifdef LIBXML_HTML_ENABLED\n\n') gen_tab(out, 'htmlEscapeTab', '&<>', False) gen_tab(out, 'htmlEscapeTabAttr', '"&', False) out.write('#endif /* LIBXML_HTML_ENABLED */\n')