X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=doclib%2Fpkgdraw;h=010262349e0fcb74c9a697306494e8861a1da4db;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=c0fd746d4cb0909d600cd5ed5e60fb082e2950a1;hpb=fc580444dae76f3aeea3ec6fefea2277760f6fd0;p=senf.git diff --git a/doclib/pkgdraw b/doclib/pkgdraw index c0fd746..0102623 100755 --- a/doclib/pkgdraw +++ b/doclib/pkgdraw @@ -11,7 +11,6 @@ TEX_HEADER = r"""\documentclass{scrartcl} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage{ae,aecompl} -\usepackage[active]{srcltx} \usepackage{color} \usepackage{bytefield} @@ -63,7 +62,7 @@ def formatSimpleField(width, start, field): namesz = areas[i]['size'] nameix = i areas[nameix]['name'] = field['name'][:int(areas[nameix]['size'] * charsPerBit)] - if len(areas) == 2 and areas[0].get('bottom',True): + if field['name'] and len(areas) == 2 and areas[0].get('bottom',True): if areas[0].get('name','') : ix = 1 else : ix = 0 if 6 <= int(areas[ix]['size'] * charsPerBit): @@ -110,6 +109,10 @@ def formatPacket(width, fields): if field.get('optional', False): for area in areas: area['optional'] = True + if start > 0 and start < width: + areas.append({ 'start': start, 'size': width-start, 'bottom': False, + 'right': False}) + start = 0 if field.get('repeat'): if start > 0 and start < width: areas.append({ 'start': start, 'size': width-start, 'bottom': False, @@ -130,7 +133,7 @@ def formatPacket(width, fields): # This is a fillup field. Check, wether to draw top: if len(rows) <= 1: areas[0]['top'] = False - elif rows[-2][-1].get('bottom', True): + elif rows[-2][-1].get('bottom', True) or not rows[-2][-1].get('right', True): areas[0]['top'] = False rows[-1].append(areas.pop(0)) if areas: @@ -154,7 +157,7 @@ def makeTex(rows): if sides == "lrtb" : sides = "" else : sides = "[%s]" % sides if area.get('filled', False): - line.append(r"\bitbox%s{%s}{\color[gray]{0.7}\rule{\width}{\height}}" % (sides, area['size'])) + line.append(r"\bitbox%s{%s}{\color[gray]{0.93}\rule{\width}{\height}}" % (sides, area['size'])) elif area.get('skip', False): line.append(r"\skippedwords") elif area.get('dots', False): @@ -173,11 +176,23 @@ def stripComments(text): def replacer(match): s = match.group(0) if s.startswith('//pkgdraw:'): - return s + return "@@" + s[2:] if s.startswith('/'): return "" return s return COMMENT_RE.sub(replacer, text) + +SENF_INCLUDE_RE = re.compile(r"#\s*include\s*SENF_") + +def quoteMacros(text): + return SENF_INCLUDE_RE.sub("PKGDRAW_", text).replace("SENF_PARSER_","PKGDRAW_PARSER_") + +def cppExpand(text, cppopts, dir): + tmpf = tempfile.NamedTemporaryFile(dir=dir) + tmpf.write(text) + tmpf.flush() + cmd = "gcc %s -E -o - -x c++-header %s" % (" ".join(cppopts), tmpf.name) + return os.popen(cmd).read() FIELD_TYPES = { 'UInt8Parser' : {'size': 8 }, @@ -334,22 +349,42 @@ def parse_PRIVATE_VARIANT(args, flags): def parse_INIT(args, flags): return None -PARSER_START_RE = re.compile(r"#\s*include\s+SENF_(FIXED_)?PARSER\s*\(\s*\)") -PARSER_END_RE = re.compile(r"SENF_PARSER_FINALIZE\s*\(([^)]*)\)\s*;") -PARSER_FIELD_RE = re.compile(r"(?://>pkgdraw:(.*)$\s*)?SENF_PARSER_([A-Z_]+)\s*\(([^;]*)\)\s*;(?:\s*//pkgdraw:(.*)$\s*)?PKGDRAW_PARSER_([A-Z_]+)\s*\(([^;]*)\)\s*;(?:\s*@@ [...] [-- ...]\n" + % sys.argv[0]) + sys.exit(1) + +source = args.pop(0) +target = args.pop(0) + +while args and args[0] != '--' : names.append(args.pop(0)) +if args : gccopts = args[1:] + +data, order = scanPackets(cppExpand(quoteMacros(stripComments(file(source).read())), + gccopts, os.path.dirname(source))) texf = file(os.path.join(tmpdir, "fields.tex"),"w") texf.write(TEX_HEADER) -if len(sys.argv) > 1: - names = sys.argv[1:] -else: - names = data.keys() - names.sort() +if not names: + order.reverse() + names = order for name in names: texf.write("\\textbf{%s}\n\\bigskip\\par\n" % texquote(name)) @@ -405,4 +464,4 @@ if os.system("cd %s; %s/textogif -png -dpi 80 -res 0.25 fields >pkgdraw.log 2>&1 sys.stderr.write("Conversion failed. See %s\n" % tmpdir) os._exit(1) -sys.stdout.write(file(os.path.join(tmpdir, "fields.png")).read()) +file(target,"w").write(file(os.path.join(tmpdir, "fields.png")).read())