diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-05-12 10:17:27 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-05-12 10:17:27 -0700 |
commit | 387c1c271426256ed04439d43b31cdc41a625ed1 (patch) | |
tree | 877547fe5b026be1f790b00b4c3541068a3c7942 /insns.pl | |
parent | d58656f797b78cecc9ddb39bb43dd4fa23d69b33 (diff) | |
download | nasm-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.pl | 45 |
1 files changed, 29 insertions, 16 deletions
@@ -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]; |