diff options
author | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-15 02:29:40 -0700 |
---|---|---|
committer | H. Peter Anvin (Intel) <hpa@zytor.com> | 2019-08-15 02:29:40 -0700 |
commit | 6d5c77c95fcbc582de14ed3ebce19e7cd462acb8 (patch) | |
tree | a3597b0f2cef1d83e926c11329b9d267a737c226 | |
parent | 566a0f21875f2a39cbbee43cb7bbd15b685a3feb (diff) | |
download | nasm-6d5c77c95fcbc582de14ed3ebce19e7cd462acb8.tar.gz |
stdmac: handle up to 160 directives, make macros.c more readable
Handle up to 160 directives for stdmac compression. This is done by
allowing the directive numbers to wrap around (128-255, 0-31), using
127 for end of line, and forcing any whitespace character to be space.
Make macros.c a bit more legible by using #defines for the byte codes;
strictly for the benefit of the human reader.
Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com>
-rw-r--r-- | asm/preproc.c | 23 | ||||
-rwxr-xr-x | macros/macros.pl | 81 |
2 files changed, 68 insertions, 36 deletions
diff --git a/asm/preproc.c b/asm/preproc.c index 9c84e505..251768ee 100644 --- a/asm/preproc.c +++ b/asm/preproc.c @@ -798,19 +798,26 @@ static char *line_from_stdmac(void) if (!stdmacpos) return NULL; - while ((c = *p++)) { - if (c >= 0x80) - len += pp_directives_len[c - 0x80] + 1; + /* + * 32-126 is ASCII, 127 is end of line, 128-31 are directives + * (allowed to wrap around) corresponding to PP_* tokens 0-159. + */ + while ((c = *p++) != 127) { + uint8_t ndir = c - 128; + if (ndir < 256-96) + len += pp_directives_len[ndir] + 1; else len++; } line = nasm_malloc(len + 1); q = line; - while ((c = *stdmacpos++)) { - if (c >= 0x80) { - memcpy(q, pp_directives[c - 0x80], pp_directives_len[c - 0x80]); - q += pp_directives_len[c - 0x80]; + + while ((c = *stdmacpos++) != 127) { + uint8_t ndir = c - 128; + if (ndir < 256-96) { + memcpy(q, pp_directives[ndir], pp_directives_len[ndir]); + q += pp_directives_len[ndir]; *q++ = ' '; } else { *q++ = c; @@ -819,7 +826,7 @@ static char *line_from_stdmac(void) stdmacpos = p; *q = '\0'; - if (!*stdmacpos) { + if (*stdmacpos == 127) { /* This was the last of this particular macro set */ stdmacpos = NULL; if (*stdmacnext) { diff --git a/macros/macros.pl b/macros/macros.pl index 2f5d40d1..eb79d1ee 100755 --- a/macros/macros.pl +++ b/macros/macros.pl @@ -45,6 +45,19 @@ my $fname; my $line = 0; my $index = 0; my $tasm_count = 0; +my @pname; + +# Default names for various bytes +for (my $o = 0; $o < 256; $o++) { + my $c = chr($o); + if ($o < 32 || $o > 126) { + $pname[$o] = sprintf("%d", $o); + } elsif ($c =~ /^[\'\"\\]$/) { + $pname[$o] = "\'\\".$c."\'"; + } else { + $pname[$o] = "\'".$c."\'"; + } +} # # Print out a string as a character array @@ -64,24 +77,19 @@ sub charcify(@) { } elsif ($c =~ /^[\'\"\`]$/) { $quote = $o; } else { - if ($c =~ /\s/) { + if ($c eq ' ') { next if ($space); $o = 32; $c = ' '; $space = 1; - } elsif ($o > 126) { + } elsif ($o < 32 || $o > 126) { $space = 1; # Implicit space after compacted directive } else { $space = 0; } } - - if ($o < 32 || $o > 126 || $c eq '"' || $c eq "\\") { - $l .= sprintf("%3d,", $o); - } else { - $c =~ s/\'/\\'/; # << sanitize single quote. - $l .= "\'".$c."\',"; - } + $l .= $pname[$o]; + $l .= ','; } return $l; } @@ -114,6 +122,21 @@ my $outfmt; my $lastname; my $z; +my @pptok_list = sort { $pptok_hash{$a} <=> $pptok_hash{$b} } keys %pptok_hash; +my %pnum; + +foreach my $pt (@pptok_list) { + my $n = $pptok_hash{$pt}; + if ($pt !~ /[A-Z]/ && $n < 256-96) { + $n = ($n+128) & 255; + (my $et = $pt) =~ s/^\%/p_/; + printf OUT "#define %-24s %3d\n", $et, $n; + $pnum{$pt} = $n; + $pname[$n] = $et; + } +} +printf OUT "#define %-24s %3d\n\n", 'EOL', 127; + foreach $args ( @ARGV ) { my @file_list = glob ( $args ); foreach $fname ( @file_list ) { @@ -127,11 +150,16 @@ foreach $args ( @ARGV ) { chomp; $line++; } - if (m/^OUT:\s*(.*\S)\s*$/) { + s/^\s*(|\S|\S.*\S|)\s*(\;([^\"\']|\"[^\"]*\"|\'[^\']*\')*|)$/$1/; + s/\s+/ /g; + next if ($_ eq ''); + print '"',$_, "\"\n"; + + if (m/^OUT:\s*(\S.*)$/) { undef $pkg; my @out_alias = split(/\s+/, $1); if (defined($name)) { - printf OUT " /* %4d */ 0\n", $index++; + printf OUT " /* %4d */ EOL\n", $index++; print OUT "};\n#endif\n"; undef $name; } @@ -146,27 +174,27 @@ foreach $args ( @ARGV ) { print OUT "\nconst unsigned char ${name}[] = {\n"; print OUT " /* From $fname */\n"; $lastname = $fname; - } elsif (m/^STD:\s*(.*\S)\s*$/) { + } elsif (m/^STD:\s*(\S+)$/) { undef $pkg; - my @out_alias = split(/\s+/, $1); + my $std = $1; if (defined($name)) { - printf OUT " /* %4d */ 0\n", $index++; + printf OUT " /* %4d */ EOL\n", $index++; print OUT "};\n#endif\n"; undef $name; } $index = 0; print OUT "\n#if 1"; - $name = 'nasm_stdmac_' . $out_alias[0]; + $name = 'nasm_stdmac_' . $std; print OUT "\nconst unsigned char ${name}[] = {\n"; print OUT " /* From $fname */\n"; $lastname = $fname; - } elsif (m/^USE:\s*(\S+)\s*$/) { + } elsif (m/^USE:\s*(\S+)$/) { $pkg = $1; if (defined($pkg_number{$pkg})) { die "$0: $fname: duplicate package: $pkg\n"; } if (defined($name)) { - printf OUT " /* %4d */ 0\n", $index++; + printf OUT " /* %4d */ EOL\n", $index++; print OUT "};\n#endif\n"; undef $name; } @@ -178,26 +206,25 @@ foreach $args ( @ARGV ) { $lastname = $fname; push(@pkg_list, $pkg); $pkg_number{$pkg} = $npkg++; - $z = pack("C", $pptok_hash{'%define'}+128)."__USE_\U$pkg\E__"; - printf OUT " /* %4d */ %s0,\n", $index, charcify($z); + $z = pack("C", $pnum{'%define'})."__USE_\U$pkg\E__"; + printf OUT " /* %4d */ %sEOL,\n", $index, charcify($z); $index += length($z)+1; - } elsif (m/^\s*((\s*([^\"\';\s]+|\"[^\"]*\"|\'[^\']*\'))*)\s*(;.*)?$/) { + } else { my($s1, $s2, $pd, $ws); if (!defined($name)) { die "$0: $fname: macro declarations outside a known block\n"; } - $s1 = $1; + $s1 = $_; $s2 = ''; while ($s1 =~ /(\%[a-zA-Z_][a-zA-Z0-9_]*)((\s+)(.*)|)$/) { $s2 .= "$'"; $pd = $1; $ws = $3; $s1 = $4; - if (defined($pptok_hash{$pd}) && - $pptok_hash{$pd} <= 127) { - $s2 .= pack("C", $pptok_hash{$pd}+128); + if (defined($pnum{$pd})) { + $s2 .= pack("C", $pnum{$pd}); } else { $s2 .= $pd.$ws; } @@ -208,12 +235,10 @@ foreach $args ( @ARGV ) { print OUT "\n /* From $fname */\n"; $lastname = $fname; } - printf OUT " /* %4d */ %s0,\n", + printf OUT " /* %4d */ %sEOL,\n", $index, charcify($s2); $index += length($s2)+1; } - } else { - die "$fname:$line: error: unterminated quote\n"; } } close(INPUT); @@ -221,7 +246,7 @@ foreach $args ( @ARGV ) { } if (defined($name)) { - printf OUT " /* %4d */ 0\n", $index++; + printf OUT " /* %4d */ EOL\n", $index++; print OUT "};\n#endif\n"; undef $name; } |