X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=doclib%2Fpkgdraw;h=010262349e0fcb74c9a697306494e8861a1da4db;hb=7bd56a99323c473e899afa26e0cb59d58abce163;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())