All pastes #1397108 Raw Edit

libdisasm

public diff v1 · immutable
#1397108 ·published 2009-04-20 06:22 UTC
rendered paste body
diff --git a/libdisasm/test/static-generate.py b/libdisasm/test/static-generate.pynew file mode 100755index 0000000..1eb95c8--- /dev/null+++ b/libdisasm/test/static-generate.py@@ -0,0 +1,118 @@+#!/usr/bin/env python++# Copyright (c) 2009 Diego Ongaro <ongardie@gmail.com>+#+# Redistribution and use in source and binary forms, with or without+# modification, are permitted provided that the following conditions+# are met:+#+#   1. Redistributions of source code must retain the above copyright+#   notice, this list of conditions and the following disclaimer.+#   2. Redistributions in binary form must reproduce the above+#   copyright notice, this list of conditions and the following+#   disclaimer in the documentation and/or other materials provided+#   with the distribution.+#+# THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FREEBSD PROJECT OR+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+# SUCH DAMAGE.++import sys++DEFINITIONS = 'static.txt'+MODES = ['intel-32', 'att-32', 'intel-16', 'att-16']++if len(sys.argv) >= 2:+    target = sys.argv[1]+else:+    target = 'static-tests'++# Read lines from definitions file+data = []+linenum = 1+for line in open(DEFINITIONS).readlines():+    # strip out comments+    line = line.split('#', 1)[0]++    # strip out whitespace+    line = line.strip()++    # strip out blank lines+    if len(line) != 0:+        data.append((linenum, line))+    linenum += 1++class SError(SyntaxError):+    def __init__(self, linenum, line, msg):+        self.linenum = linenum+        self.line = line+        self.msg = msg++    def __str__(self):+        return "%s on line %d ('%s')" % (self.msg,+                                         self.linenum,+                                         self.line)+++# Parse lines into a list of tests+tests = []+test = None+for (linenum, line) in data:++    # split by ':' into 'label: value'+    if ':' not in line:+        raise SError(linenum, line, "Missing ':'")+    label, value = map(str.strip, line.split(':', 1))++    if not label: +        raise SError(linenum, line, "Missing label")+    if not value:+        raise SError(linenum, line, "Missing value")++    if label == 'input':++        # save previous test+        if test is not None:+            if len(test) < len(MODES) + 1:+                raise SError(linenum, line, "Test missing output line(s)")+            tests.append(test)++        # start new test+        try:+            [chr(int(byte, 16)) for byte in value.split()]+        except ValueError:+            raise SError(linenum, line, "Expected space-separated hex bytes")+        test = {label: value}++    elif label in MODES:+        if test is None:+            raise SError(linenum, line, "Tests must start with an 'input' line")+        if label in test:+            raise SError(linenum, line, "Duplicate output line")+        test[label] = value++# save last test+if test is not None:+    if len(test) < len(MODES) + 1:+            raise SError(linenum, line, "Test missing output line(s)")+    tests.append(test)++# write files out for run-static.sh+files = {'input': open('%s.bin' % (target), 'w')}+for mode in MODES:+    files[mode] = open('%s.%s' % (target, mode), 'w')++for test in tests:+    for byte in test['input'].split():+        files['input'].write(chr(int(byte, 16)))+    for mode in MODES:+        files[mode].write('%-30s %s\n' % (test['input'], test[mode]))diff --git a/libdisasm/test/static-generate.sh b/libdisasm/test/static-generate.shdeleted file mode 100755index 286398b..0000000--- a/libdisasm/test/static-generate.sh+++ /dev/null@@ -1,13 +0,0 @@-#!/bin/sh-if [ -z "$1" ]; then-    echo "Usage: $0 TARGET" >&2-    exit 1-fi---# Thanks to Diego Ongaro and Brent Stephens-/bin/echo -ne '\x81\x3E\x00\x00\x55\xAA' > "$1".bin-echo '81 3E 00 00 55 AA           cmp [esi], 0xAA550000' > "$1".intel-32-echo '81 3E 00 00 55 AA           cmpl    $0xAA550000, (%esi)' > "$1".att-32-echo '81 3E 00 00 55 AA           cmp [], 0xAA55' > "$1".intel-16-echo '81 3E 00 00 55 AA           cmpw    $0xAA55, 0x0' > "$1".att-16diff --git a/libdisasm/test/static.txt b/libdisasm/test/static.txtnew file mode 100644index 0000000..af5b49d--- /dev/null+++ b/libdisasm/test/static.txt@@ -0,0 +1,13 @@+# Thanks to Diego Ongaro and Brent Stephens+input:      81 3E 00 00 55 AA+intel-32:   cmp [esi], 0xAA550000+att-32:     cmpl    $0xAA550000, (%esi)+intel-16:   cmp [], 0xAA55+att-16:     cmpw    $0xAA55, 0x0++# Thanks to Diego Ongaro+input:      26 F3 6F+intel-32:   repz outs   edx, es:[esi]+att-32:     repz outsl  %es:(%esi), %edx+intel-16:   repz outs   dx, es:[esi]+att-16:     repz outsw  %es:(%esi), %dx