summaryrefslogtreecommitdiff
path: root/insns.pl
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2008-05-12 10:17:27 -0700
committerH. Peter Anvin <hpa@zytor.com>2008-05-12 10:17:27 -0700
commit387c1c271426256ed04439d43b31cdc41a625ed1 (patch)
tree877547fe5b026be1f790b00b4c3541068a3c7942 /insns.pl
parentd58656f797b78cecc9ddb39bb43dd4fa23d69b33 (diff)
downloadnasm-387c1c271426256ed04439d43b31cdc41a625ed1.tar.gz
nasm-387c1c271426256ed04439d43b31cdc41a625ed1.tar.bz2
nasm-387c1c271426256ed04439d43b31cdc41a625ed1.zip
Factor out string decoder in insns.pl
Factor out the string decoder into its own subroutine. This will be useful shortly ;)
Diffstat (limited to 'insns.pl')
-rw-r--r--insns.pl45
1 files changed, 29 insertions, 16 deletions
diff --git a/insns.pl b/insns.pl
index 64d60b4..03c840a 100644
--- a/insns.pl
+++ b/insns.pl
@@ -275,6 +275,34 @@ sub addprefix ($@) {
return @l;
}
+#
+# Turn a code string into a sequence of bytes
+#
+sub decodify($) {
+ # Although these are C-syntax strings, by convention they should have
+ # only octal escapes (for directives) and hexadecimal escapes
+ # (for verbatim bytes)
+ my($codestr) = @_;
+ my $c = $codestr;
+ my @codes = ();
+
+ while ($c ne '') {
+ if ($c =~ /^\\x([0-9a-f]+)(.*)$/i) {
+ push(@codes, hex $1);
+ $c = $2;
+ next;
+ } elsif ($c =~ /^\\([0-7]{1,3})(.*)$/) {
+ push(@codes, oct $1);
+ $c = $2;
+ next;
+ } else {
+ die "$0: unknown code format in \"$codestr\"\n";
+ }
+ }
+
+ return @codes;
+}
+
# Here we determine the range of possible starting bytes for a given
# instruction. We need only consider the codes:
# \1 \2 \3 mean literal bytes, of course
@@ -291,22 +319,7 @@ sub startseq($) {
my $c0, $c1, $i;
my $prefix = '';
- # Although these are C-syntax strings, by convention they should have
- # only octal escapes (for directives) and hexadecimal escapes
- # (for verbatim bytes)
- while ($c ne '') {
- if ($c =~ /^\\x([0-9a-f]+)(.*)$/i) {
- push(@codes, hex $1);
- $c = $2;
- next;
- } elsif ($c =~ /^\\([0-7]{1,3})(.*)$/) {
- push(@codes, oct $1);
- $c = $2;
- next;
- } else {
- die "$0: unknown code format in \"$codestr\"\n";
- }
- }
+ @codes = decodify($codestr);
while ($c0 = shift(@codes)) {
$c1 = $codes[0];