⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdsrc.pl

📁 开源的nasm编译器源码,研究编译器原理很有帮且
💻 PL
📖 第 1 页 / 共 3 页
字号:
    }  }}sub write_txt {  # This is called from the top level, so I won't bother using  # my or local.  # Open file.  print "writing file...";  open TEXT,">nasmdoc.txt";  select TEXT;  # Preamble.  $title = "The Netwide Assembler: NASM";  $spaces = ' ' x ((75-(length $title))/2);  ($underscore = $title) =~ s/./=/g;  print "$spaces$title\n$spaces$underscore\n";  for ($para = 0; $para <= $#pnames; $para++) {    $pname = $pnames[$para];    $pflags = $pflags[$para];    $ptype = substr($pflags,0,4);    print "\n"; # always one of these before a new paragraph    if ($ptype eq "chap") {      # Chapter heading. "Chapter N: Title" followed by a line of      # minus signs.      $pflags =~ /chap (.*) :(.*)/;      $title = "Chapter $1: ";      foreach $i (@$pname) {        $ww = &word_txt($i);        $title .= $ww unless $ww eq "\001";      }      print "$title\n";      $title =~ s/./-/g;      print "$title\n";    } elsif ($ptype eq "appn") {      # Appendix heading. "Appendix N: Title" followed by a line of      # minus signs.      $pflags =~ /appn (.*) :(.*)/;      $title = "Appendix $1: ";      foreach $i (@$pname) {        $ww = &word_txt($i);        $title .= $ww unless $ww eq "\001";      }      print "$title\n";      $title =~ s/./-/g;      print "$title\n";    } elsif ($ptype eq "head" || $ptype eq "subh") {      # Heading or subheading. Just a number and some text.      $pflags =~ /.... (.*) :(.*)/;      $title = sprintf "%6s ", $1;      foreach $i (@$pname) {        $ww = &word_txt($i);        $title .= $ww unless $ww eq "\001";      }      print "$title\n";    } elsif ($ptype eq "code") {      # Code paragraph. Emit each line with a seven character indent.      foreach $i (@$pname) {        warn "code line longer than 68 chars: $i\n" if length $i > 68;        print ' 'x7, $i, "\n";      }    } elsif ($ptype eq "bull" || $ptype eq "norm") {      # Ordinary paragraph, optionally bulleted. We wrap, with ragged      # 75-char right margin and either 7 or 11 char left margin      # depending on bullets.      if ($ptype eq "bull") {        $line = ' 'x7 . '(*) ';	$next = ' 'x11;      } else {        $line = $next = ' 'x7;      }      @a = @$pname;      $wd = $wprev = '';      do {        do { $w = &word_txt(shift @a) } while $w eq "\001"; # nasty hack	$wd .= $wprev;	if ($wprev =~ /-$/ || $w eq ' ' || $w eq '' || $w eq undef) {	  if (length ($line . $wd) > 75) {	    $line =~ s/\s*$//; # trim trailing spaces	    print "$line\n";	    $line = $next;	    $wd =~ s/^\s*//; # trim leading spaces	  }	  $line .= $wd;	  $wd = '';	}	$wprev = $w;      } while ($w ne '' && $w ne undef);      if ($line =~ /\S/) {	$line =~ s/\s*$//; # trim trailing spaces	print "$line\n";      }    }  }  # Close file.  select STDOUT;  close TEXT;}sub word_txt {  my ($w) = @_;  my $wtype, $wmajt;  return undef if $w eq '' || $w eq undef;  $wtype = substr($w,0,2);  $wmajt = substr($wtype,0,1);  $w = substr($w,2);  $w =~ s/<.*>// if $wmajt eq "w"; # remove web links  if ($wmajt eq "n" || $wtype eq "e " || $wtype eq "w ") {    return $w;  } elsif ($wtype eq "sp") {    return ' ';  } elsif ($wtype eq "da") {    return '-';  } elsif ($wmajt eq "c" || $wtype eq "wc") {    return "`${w}'";  } elsif ($wtype eq "es") {    return "_${w}";  } elsif ($wtype eq "ee") {    return "${w}_";  } elsif ($wtype eq "eo") {    return "_${w}_";  } elsif ($wmajt eq "x" || $wmajt eq "i") {    return "\001";  } else {    die "panic in word_txt: $wtype$w\n";  }}sub write_html {  # This is called from the top level, so I won't bother using  # my or local.  # Write contents file. Just the preamble, then a menu of links to the  # separate chapter files and the nodes therein.  print "writing contents file...";  open TEXT,">nasmdoc0.html";  select TEXT;  &html_preamble(0);  print "<p>This manual documents NASM, the Netwide Assembler: an assembler\n";  print "targetting the Intel x86 series of processors, with portable source.\n";  print "<p>";  for ($node = $tstruct_next{'Top'}; $node; $node = $tstruct_next{$node}) {    if ($tstruct_level{$node} == 1) {      # Invent a file name.      ($number = lc($xrefnodes{$node})) =~ s/.*-//;      $fname="nasmdocx.html";      substr($fname,8 - length $number, length $number) = $number;      $html_fnames{$node} = $fname;      $link = $fname;      print "<p>";    } else {      # Use the preceding filename plus a marker point.      $link = $fname . "#$xrefnodes{$node}";    }    $title = "$node: ";    $pname = $tstruct_pname{$node};    foreach $i (@$pname) {      $ww = &word_html($i);      $title .= $ww unless $ww eq "\001";    }    print "<a href=\"$link\">$title</a><br>\n";  }  print "<p><a href=\"nasmdoci.html\">Index</a>\n";  print "</body></html>\n";  select STDOUT;  close TEXT;  # Open a null file, to ensure output (eg random &html_jumppoints calls)  # goes _somewhere_.  print "writing chapter files...";  open TEXT,">/dev/null";  select TEXT;  $html_lastf = '';  $in_list = 0;  for ($para = 0; $para <= $#pnames; $para++) {    $pname = $pnames[$para];    $pflags = $pflags[$para];    $ptype = substr($pflags,0,4);    $in_list = 0, print "</ul>\n" if $in_list && $ptype ne "bull";    if ($ptype eq "chap") {      # Chapter heading. Begin a new file.      $pflags =~ /chap (.*) :(.*)/;      $title = "Chapter $1: ";      $xref = $2;      &html_jumppoints; print "</body></html>\n"; select STDOUT; close TEXT;      $html_lastf = $html_fnames{$chapternode};      $chapternode = $nodexrefs{$xref};      $html_nextf = $html_fnames{$tstruct_mnext{$chapternode}};      open TEXT,">$html_fnames{$chapternode}"; select TEXT; &html_preamble(1);      foreach $i (@$pname) {        $ww = &word_html($i);        $title .= $ww unless $ww eq "\001";      }      $h = "<h2><a name=\"$xref\">$title</a></h2>\n";      print $h; print FULL $h;    } elsif ($ptype eq "appn") {      # Appendix heading. Begin a new file.      $pflags =~ /appn (.*) :(.*)/;      $title = "Appendix $1: ";      $xref = $2;      &html_jumppoints; print "</body></html>\n"; select STDOUT; close TEXT;      $html_lastf = $html_fnames{$chapternode};      $chapternode = $nodexrefs{$xref};      $html_nextf = $html_fnames{$tstruct_mnext{$chapternode}};      open TEXT,">$html_fnames{$chapternode}"; select TEXT; &html_preamble(1);      foreach $i (@$pname) {        $ww = &word_html($i);        $title .= $ww unless $ww eq "\001";      }      print "<h2><a name=\"$xref\">$title</a></h2>\n";    } elsif ($ptype eq "head" || $ptype eq "subh") {      # Heading or subheading.      $pflags =~ /.... (.*) :(.*)/;      $hdr = ($ptype eq "subh" ? "h4" : "h3");      $title = $1 . " ";      $xref = $2;      foreach $i (@$pname) {        $ww = &word_html($i);        $title .= $ww unless $ww eq "\001";      }      print "<$hdr><a name=\"$xref\">$title</a></$hdr>\n";    } elsif ($ptype eq "code") {      # Code paragraph.      print "<p><pre>\n";      foreach $i (@$pname) {	$w = $i;	$w =~ s/&/&amp;/g;	$w =~ s/</&lt;/g;	$w =~ s/>/&gt;/g;        print $w, "\n";      }      print "</pre>\n";    } elsif ($ptype eq "bull" || $ptype eq "norm") {      # Ordinary paragraph, optionally bulleted. We wrap, with ragged      # 75-char right margin and either 7 or 11 char left margin      # depending on bullets.      if ($ptype eq "bull") {        $in_list = 1, print "<ul>\n" unless $in_list;        $line = '<li>';      } else {        $line = '<p>';      }      @a = @$pname;      $wd = $wprev = '';      do {        do { $w = &word_html(shift @a) } while $w eq "\001"; # nasty hack	$wd .= $wprev;	if ($w eq ' ' || $w eq '' || $w eq undef) {	  if (length ($line . $wd) > 75) {	    $line =~ s/\s*$//; # trim trailing spaces	    print "$line\n";	    $line = '';	    $wd =~ s/^\s*//; # trim leading spaces	  }	  $line .= $wd;	  $wd = '';	}	$wprev = $w;      } while ($w ne '' && $w ne undef);      if ($line =~ /\S/) {	$line =~ s/\s*$//; # trim trailing spaces	print "$line\n";      }    }  }  # Close whichever file was open.  &html_jumppoints;  print "</body></html>\n";  select STDOUT;  close TEXT;  print "\n   writing index file...";  open TEXT,">nasmdoci.html";  select TEXT;  &html_preamble(0);  print "<p align=center><a href=\"nasmdoc0.html\">Contents</a>\n";  print "<p>";  &html_index;  print "<p align=center><a href=\"nasmdoc0.html\">Contents</a>\n";  print "</body></html>\n";  select STDOUT;  close TEXT;}sub html_preamble {  print "<html><head><title>NASM Manual</title></head>\n";  print "<body><h1 align=center>The Netwide Assembler: NASM</h1>\n\n";  &html_jumppoints if $_[0];}sub html_jumppoints {  print "<p align=center>";  print "<a href=\"$html_nextf\">Next Chapter</a> |\n" if $html_nextf;  print "<a href=\"$html_lastf\">Previous Chapter</a> |\n" if $html_lastf;  print "<a href=\"nasmdoc0.html\">Contents</a> |\n";  print "<a href=\"nasmdoci.html\">Index</a>\n";}sub html_index {  my $itag, $a, @ientry, $sep, $w, $wd, $wprev, $line;  $chapternode = '';  foreach $itag (@itags) {    $ientry = $idxmap{$itag};    @a = @$ientry;    push @a, "n :";    $sep = 0;    foreach $node (@nodes) {      next if !$idxnodes{$node,$itag};      push @a, "n ," if $sep;      push @a, "sp", "x $xrefnodes{$node}", "n $node", "xe$xrefnodes{$node}";      $sep = 1;    }    $line = '';    do {      do { $w = &word_html(shift @a) } while $w eq "\001"; # nasty hack      $wd .= $wprev;      if ($w eq ' ' || $w eq '' || $w eq undef) {        if (length ($line . $wd) > 75) {	  $line =~ s/\s*$//; # trim trailing spaces	  print "$line\n";	  $line = '';	  $wd =~ s/^\s*//; # trim leading spaces	}	$line .= $wd;	$wd = '';      }      $wprev = $w;    } while ($w ne '' && $w ne undef);    if ($line =~ /\S/) {      $line =~ s/\s*$//; # trim trailing spaces      print "$line\n";    }    print "<br>\n";  }}sub word_html {  my ($w) = @_;  my $wtype, $wmajt, $pfx, $sfx;  return undef if $w eq '' || $w eq undef;  $wtype = substr($w,0,2);  $wmajt = substr($wtype,0,1);  $w = substr($w,2);  $pfx = $sfx = '';  $pfx = "<a href=\"$1\">", $sfx = "</a>", $w = $2    if $wmajt eq "w" && $w =~ /^<(.*)>(.*)$/;  $w =~ s/&/&amp;/g;  $w =~ s/</&lt;/g;  $w =~ s/>/&gt;/g;  if ($wmajt eq "n" || $wtype eq "e " || $wtype eq "w ") {    return $pfx . $w . $sfx;  } elsif ($wtype eq "sp") {    return ' ';  } elsif ($wtype eq "da") {    return '-'; # sadly, en-dashes are non-standard in HTML  } elsif ($wmajt eq "c" || $wtype eq "wc") {    return $pfx . "<code><nobr>${w}</nobr></code>" . $sfx;  } elsif ($wtype eq "es") {    return "<em>${w}";  } elsif ($wtype eq "ee") {    return "${w}</em>";  } elsif ($wtype eq "eo") {    return "<em>${w}</em>";  } elsif ($wtype eq "x ") {    # Magic: we must resolve the cross reference into file and marker    # parts, then dispose of the file part if it's us, and dispose of    # the marker part if the cross reference describes the top node of    # another file.    my $node = $nodexrefs{$w}; # find the node we're aiming at    my $level = $tstruct_level{$node}; # and its level    my $up = $node, $uplev = $level-1;    $up = $tstruct_up{$up} while $uplev--; # get top node of containing file    my $file = ($up ne $chapternode) ? $html_fnames{$up} : "";    my $marker = ($level == 1 and $file) ? "" : "#$w";    return "<a href=\"$file$marker\">";  } elsif ($wtype eq "xe") {    return "</a>";  } elsif ($wmajt eq "i") {    return "\001";  } else {    die "panic in word_html: $wtype$w\n";  }}sub write_texi {  # This is called from the top level, so I won't bother using  # my or local.  # Open file.  print "writing file...";  open TEXT,">nasmdoc.texi";  select TEXT;  # Preamble.  print "\\input texinfo   \@c -*-texinfo-*-\n";  print "\@c \%**start of header\n";  print "\@setfilename ",$metadata{'infofile'},".info\n";  print "\@dircategory ",$metadata{'category'},"\n";  print "\@direntry\n";  printf "* %-28s %s.\n",  sprintf('%s: (%s).', $metadata{'infoname'}, $metadata{'infofile'}),  $metadata{'infotitle'};  print "\@end direntry\n";  print "\@settitle ", $metadata{'title'},"\n";  print "\@setchapternewpage odd\n";  print "\@c \%**end of header\n";  print "\n";  print "\@ifinfo\n";  print $metadata{'summary'}, "\n";  print "\n";  print "Copyright ",$metadata{'year'}," ",$metadata{'author'},"\n";  print "\n";  print $metadata{'license'}, "\n";  print "\@end ifinfo\n";  print "\n";  print "\@titlepage\n";  $title = $metadata{'title'};  $title =~ s/ - / --- /g;  print "\@title ${title}\n";  print "\@author ",$metadata{'author'},"\n";  print "\n";  print "\@page\n";  print "\@vskip 0pt plus 1filll\n";  print "Copyright \@copyright{} ",$metadata{'year'},' ',$metadata{'author'},"\n";  print "\n";  print $metadata{'license'}, "\n";  print "\@end titlepage\n";  print "\n";  print "\@node Top, $tstruct_next{'Top'}, (dir), (dir)\n";  print "\@top ",$metadata{'infotitle'},"\n";  print "\n";  print "\@ifinfo\n";  print $metadata{'summary'}, "\n";  print "\@end ifinfo\n";  $node = "Top";  $bulleting = 0;  for ($para = 0; $para <= $#pnames; $para++) {    $pname = $pnames[$para];    $pflags = $pflags[$para];    $ptype = substr($pflags,0,4);    $bulleting = 0, print "\@end itemize\n" if $bulleting && $ptype ne "bull";    print "\n"; # always one of these before a new paragraph    if ($ptype eq "chap") {      # Chapter heading. Begin a new node.      &texi_menu($node)        if $tstruct_level{$tstruct_next{$node}} > $tstruct_level{$node};      $pflags =~ /chap (.*) :(.*)/;      $node = "Chapter $1";      $title = "Chapter $1: ";      foreach $i (@$pname) {        $ww = &word_texi($i);        $title .= $ww unless $ww eq "\001";      }      print "\@node $node, $tstruct_next{$node}, $tstruct_prev{$node},";      print " $tstruct_up{$node}\n\@unnumbered $title\n";    } elsif ($ptype eq "appn") {      # Appendix heading. Begin a new node.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -