📄 html2db.pl
字号:
#! /usr/bin/perl## Convert html (text) source to a51 asm (db) source#$verinfo = "1.01";sub usage { print STDERR "usage: $ego [-cpurom] [-cpueeprom ] [-eeprom]\n"; print STDERR " [-html] [-plain] [-jpeg] [-gif] [-png] [-app] [-noheader]\n"; print STDERR " [-index VALUE] [-dir DIR_SEGMENT] [-body BODY_SEGMENT]\n"; print STDERR " [-offset VALUE] [-noconverthtml] [-appendlf] [-keeplf]\n"; print STDERR " [-binutils] [-version] [-help] file\n"; exit 1;}sub version { print STDERR "$ego version $verinfo\n"; exit 1;}sub printDB { local ($file, $co) = @_; $co =~ s/\\'/'/; $co =~ s/\r//; if (length $co gt 0) { if (length $co eq 1) { if ($co eq "'") { if ($binutils) { print $file "\t.byte\t\''''\n"; } else { print $file "\tDB\t\''''\n"; } } else{ if ($binutils) { print $file "\t.byte\t\'$co\'\n"; } else { print $file "\tDB\t\'$co\'\n"; } } } else { if ($binutils) { $co =~ s/"/\\\"/g; print $file "\t.ascii\t\"$co\"\n"; } else { $co =~ s/"/",22h,"/g; print $file "\tDB\t\"$co\"\n"; } } } if ($appendlf) { if ($binutils) { print $file "\t.byte\t0x0A\n"; } else { print $file "\tDB\t0Ah\n"; } }}sub process_define { local ($file, $co) = @_; if ($binutils eq 0) { if ($co =~ /^#:C[(]([_a-zA-Z0-9]+)[)]/) {#external code $co = $1; print $file "extrn\tCODE($co)\n"; } elsif ($co =~ /^#:D[(]([_a-zA-Z0-9]+)[)]/) {#external data $co = $1; print $file "extrn\tDATA($co)\n"; } elsif ($co =~ /^#:X[(]([_a-zA-Z0-9]+)[)]/) {#external data $co = $1; print $file "extrn\tXDATA($co)\n"; } elsif ($co =~ /^#:Y[(]([_a-zA-Z0-9]+)[)]/) {#external data $co = $1; print $file "extrn\tIDATA($co)\n"; } elsif ($co =~ /^#:N[(]([_a-zA-Z0-9]+)[)]/) {#external number $co = $1; print $file "extrn\tNUMBER($co)\n"; } elsif ($co =~ /^#:H[(]([_a-zA-Z0-9]+)[)]/) {#header - directory $directory = $1; } elsif ($co =~ /^#:I[(]([_a-zA-Z0-9]+)[)]/) {#index - directory $indexdirectory = $1; } elsif ($co =~ /^#:B[(]([_a-zA-Z0-9]+)[)]/) {#body $body = $1; } } else { if ($co =~ /^#:H[(]([_a-zA-Z0-9]+)[)]/) {#header - directory $directory = $1; } elsif ($co =~ /^#:I[(]([_a-zA-Z0-9]+)[)]/) {#index - directory $indexdirectory = $1; } elsif ($co =~ /^#:B[(]([_a-zA-Z0-9]+)[)]/) {#body $body = $1; } }}sub printBYTE { local ($file, $co) = @_;#print STDERR "$co ";# $co =~ !s/^('\w')$/low($1)/; if ($binutils) {# $co = "0xFF & $co";# $co =~ s/^0xFF & ('\w')$/$1/; } else { $co = "low($co)"; $co =~ s/^low\(('\w')\)$/$1/; } print $file "$co";#print STDERR "$co\n";}sub process_cgi_call { local ($file, $str) = @_;#CGI call 'mac.cgi' while ($str =~ /^((\\')|[^']*)'([_a-z0-9]+)\.cgi'(.*)$/i) { $substr1 = $1; #([^']*) $substr2 = $3; #([_a-z0-9]+) $str = $4; #(.*) &printDB ($file, $substr1); if ($binutils) { print $file "\t.ascii\t\"'$substr2.cgi'\"\n"; } else { print $file "\tDB\t\"'$substr2.cgi'\"\n"; } }#CGI call 'mac.cgi?X' while ($str =~ /^((\\')|[^']*)'([_a-z0-9]+)\.cgi[?]('\w'|[_a-z0-9]+)'(.*)$/i) { $substr1 = $1; #([^']*) $substr2 = $3; #([_a-z0-9]+\.cgi) $substr3 = $4; #([_a-z0-9]+) $str = $5; #(.*) &printDB ($file, $substr1); if ($binutils) { print $file "\t.ascii\t\"'$substr2.cgi?\"\n\t.byte\t"; } else { print $file "\tDB\t\"'$substr2.cgi?\","; } &printBYTE ($file ,$substr3); print $file "\n"; }#CGI call '?mac.cgi'text1{text2} while ($str =~ /^((\\')|[^']*)'[?]([_a-z0-9]+)\.cgi'(.*)$/i) { $substr1 = $1; #([^?]*) $substr2 = $3; #([_a-z0-9]+) $str = $4; #(.*) &printDB ($file, $substr1); if ($binutils) { print $file "\t.ascii\t\"'?$substr2.cgi'\"\n"; } else { print $file "\tDB\t\"'?$substr2.cgi'\"\n"; } }#CGI call '?mac.cgi?X'text1{text2} while ($str =~ /^((\\')|[^']*)'[?]([_a-z0-9]+)\.cgi[?]('\w'|[_a-z0-9]+)'(.*)$/i) { $substr1 = $1; #([^?]*) $substr2 = $3; #([_a-z0-9]+\.cgi) $substr3 = $4; #([_a-z0-9]+) $str = $5; #(.*) &printDB ($file, $substr1); if ($binutils) { print $file "\t.ascii\t\"'?$substr2.cgi?\"\n\t.byte\t"; } else { print $file "\tDB\t\"'?$substr2.cgi?\","; } &printBYTE ($file ,$substr3); print $file "\n"; } return ($str);}$ego = $0;$ego =~ s/.*[\/\\]//;$rommode = 0;$binmode = 99;$convert = 1;$appendlf = 0;$keeplf = 0;$binutils = 0;$directory = "";$body = "";$indexdirectory = "";$offset = "";while ($ARGV[0] =~ /^-/ && $ARGV[0] ne '-') { $opt = shift; if ($opt eq '-cpurom') { $rommode = 1; if ($binutils eq 0) { if ($directory eq "") { $directory = "CPU_DIR"; } if ($body eq "") { $body = "CPU_FILES"; } } else { if ($directory eq "") { $directory = "cpu_dir"; } if ($body eq "") { $body = "cpu_files"; } } } elsif ($opt eq '-cpueeprom') { $rommode = 2; if ($binutils eq 0) { if ($directory eq "") { $directory = "EE_DIR"; } if ($body eq "") { $body = "EE_FILES"; } if ($offset eq "") { $offset = "0E000h"; } #-2000h } else { if ($directory eq "") { $directory = "ee_dir"; } if ($body eq "") { $body = "ee_files"; } } } elsif ($opt eq '-eeprom') { $rommode = 3; if ($binutils eq 0) { if ($directory eq "") { $directory = "I2C_DIR"; } if ($body eq "") { $body = "I2C_FILES"; } if ($offset eq "") { $offset = "8000h"; } } else { if ($directory eq "") { $directory = "i2c_dir"; } if ($body eq "") { $body = "i2c_files"; } if ($offset eq "") { $offset = "0x8000"; } } } elsif ($opt eq '-html') { $binmode = 1; #text/html } elsif ($opt eq '-plain') { $binmode = 2; #text/plain } elsif ($opt eq '-jpeg') { $binmode = 3; #image/jpeg } elsif ($opt eq '-gif') { $binmode = 4; #image/gif } elsif ($opt eq '-png') { $binmode = 5; #image/png } elsif ($opt eq '-app') { $binmode = 6; #application/octet-stream } elsif ($opt eq '-noheader') { $binmode = 0; #without header } elsif ($opt eq '-noconverthtml') { $convert = 0; #no convert html } elsif ($opt eq '-appendlf') { $appendlf = 1; #don't purge NL from html code - mode 1 } elsif ($opt eq '-keeplf') { $keeplf = 1; #don't purge NL from html code - mode 2 } elsif ($opt eq '-dir') { $opt = shift; $directory = $opt; } elsif ($opt eq '-body') { $opt = shift; $body = $opt; } elsif ($opt eq '-index') { $opt = shift; $indexdirectory = $opt; } elsif ($opt eq '-offset') { $opt = shift; $offset = $opt; } elsif ($opt eq '-version') { &version; } elsif ($opt eq '-help') { &usage; } elsif ($opt eq '-binutils') { $binutils = 1; } else { &usage; }}$l0 = length $ARGV[0];$name = $ARGV[0];if ($l0 eq 0) { &usage; }@names = split (/\./, $name);if (scalar @names gt 1) { $filetype = pop @names; $filetype =~ tr/a-z/A-Z/; $oname = join (".", @names);} else { $filetype = "999"; $oname = $names[0];}if ($binmode eq 99) { if ($filetype eq 'HTML') { $binmode = 1; } elsif ($filetype eq 'HTM') { $binmode = 1; } elsif ($filetype eq 'JS') { $binmode = 1; } elsif ($filetype eq 'TXT') { $binmode = 2; } elsif ($filetype eq 'JPG') { $binmode = 3; } elsif ($filetype eq 'JPEG') { $binmode = 3; } elsif ($filetype eq 'GIF') { $binmode = 4; } elsif ($filetype eq 'PNG') { $binmode = 5; } elsif ($filetype eq 'CLASS') { $binmode = 6; } elsif ($filetype eq 'CLA') { $binmode = 6; }}if ($binutils) { $oname = $oname.".asm"; }else { $oname = $oname.".a51"; }$NAME = "<".$name;unless (open NAME) { print STDERR "Missing input file $name\n"; return;}$ONAME = ">".$oname;unless (open ONAME) { print STDERR "Cannot open output file $oname\n"; return;}$prolog = 1;if ($binmode eq 99) { print STDERR "WARNING !!! missing -html/plain/jpeg/gif/png/app, using html mode\n"; $binmode =1;}if ((($binmode eq 2) || ($binmode eq 1)) && ($convert ne 0)) { while (<NAME>) { $str = $_; $str =~ s/[\n]/\r/g; # map mew-line to CR if ($str =~ /^#:[BCDHINXY][(][_a-zA-Z0-9]+[)]/) { &process_define (ONAME, $str); $str = ""; } else { if ($prolog eq 1) { if ($binutils) { print ONAME "\n\t.section\t$directory, #alloc\n\n"; print ONAME "\t.word\t'", join ("'+'", split (//, $name)), "'\n"; } else { print ONAME "\n$directory\tSEGMENT\tCODE\n\tRSEG\t$directory\n\n"; print ONAME "\tDW\t'", join ("'+'", split (//, $name)), "'\n"; } if ($binmode eq 1) { if ($binutils) { print ONAME "\t.byte\t1\t;text/html\n"; } else { print ONAME "\tDB\t1\t;text/html\n"; } } else { if ($binutils) { print ONAME "\t.byte\t2\t;text/plain\n"; } else { print ONAME "\tDB\t2\t;text/plain\n"; } } if($offset eq "") { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0\n\t.word\tend0\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0\n\tDW\tend0\n\n"; } } else { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0 + $offset\n\t.word\tend0 + $offset\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0 + $offset\n\tDW\tend0 + $offset\n\n"; } } if ($indexdirectory ne "") { if ($binutils) { print ONAME "\t.word\t$indexdirectory\n"; } else { print ONAME "\tDW\t$indexdirectory\n"; } if ($binmode eq 1) { if ($binutils) { print ONAME "\t.byte\t1\t;text/html\n"; } else { print ONAME "\tDB\t1\t;text/html\n"; } } else { if ($binutils) { print ONAME "\t.byte\t2\t;text/plain\n"; } else { print ONAME "\tDB\t2\t;text/plain\n"; } } if($offset eq "") { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0\n\t.word\tend0\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0\n\tDW\tend0\n\n"; } } else { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0 + $offset\n\t.word\tend0 + $offset\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0 + $offset\n\tDW\tend0 + $offset\n\n"; } } } if ($binutils) { print ONAME "\t.section\t$body, #alloc\n\n"; } else { print ONAME "$body\tSEGMENT\tCODE\n\tRSEG\t$body\n\n"; } print ONAME "begin0:\n"; $prolog = 0; } while (1) { ($retstr) = &process_cgi_call (ONAME, $str); last if ($retstr eq $str); $str = $retstr; } } &printDB (ONAME, $str); if ($keeplf) { if ($binutils) { print ONAME "\t.byte\t0x0A\n"; } else { print ONAME "\tDB\t0Ah\n"; } } } if ($binutils) { print ONAME "end0:\n\t;; end\n"; } else { print ONAME "end0:\n\tend\n"; }} else { if ($binutils) { print ONAME "\n\t.section\t$directory, #alloc\n\n"; print ONAME "\t.word\t'", join ("'+'", split (//, $name)), "'\n"; } else { print ONAME "\n$directory\tSEGMENT\tCODE\n\tRSEG\t$directory\n\n"; print ONAME "\tDW\t'", join ("'+'", split (//, $name)), "'\n"; } if ($binutils) { if ($binmode eq 3) { print ONAME "\t.byte\t3\t;image/jpeg\n"; } elsif ($binmode eq 4) { print ONAME "\t.byte\t4\t;image/gif\n"; } elsif ($binmode eq 5) { print ONAME "\t.byte\t5\t;image/png\n"; } elsif ($binmode eq 6) { print ONAME "\t.byte\t6\t;application/octet-stream\n"; } elsif ($binmode eq 0) { print ONAME "\t.byte\t0\t;without header\n"; } } else { if ($binmode eq 3) { print ONAME "\tDB\t3\t;image/jpeg\n"; } elsif ($binmode eq 4) { print ONAME "\tDB\t4\t;image/gif\n"; } elsif ($binmode eq 5) { print ONAME "\tDB\t5\t;image/png\n"; } elsif ($binmode eq 6) { print ONAME "\tDB\t6\t;application/octet-stream\n"; } elsif ($binmode eq 0) { print ONAME "\tDB\t0\t;without header\n"; } } if($offset eq "") { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0\n\t.word\tend0\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0\n\tDW\tend0\n\n"; } } else { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0 + $offset\n\t.word\tend0 + $offset\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0 + $offset\n\tDW\tend0 + $offset\n\n"; } } if ($indexdirectory ne "") { if ($binutils) { print ONAME "\t.word\t$indexdirectory\n"; } else { print ONAME "\tDW\t$indexdirectory\n"; } if ($binutils) { if ($binmode eq 2) { print ONAME "\t.byte\t2\t;text/plain\n"; } elsif ($binmode eq 3) { print ONAME "\t.byte\t3\t;image/jpeg\n"; } elsif ($binmode eq 4) { print ONAME "\t.byte\t4\t;image/gif\n"; } elsif ($binmode eq 5) { print ONAME "\t.byte\t5\t;image/png\n"; } elsif ($binmode eq 6) { print ONAME "\t.byte\t6\t;application/octet-stream\n"; } } else { if ($binmode eq 2) { print ONAME "\tDB\t2\t;text/plain\n"; } elsif ($binmode eq 3) { print ONAME "\tDB\t3\t;image/jpeg\n"; } elsif ($binmode eq 4) { print ONAME "\tDB\t4\t;image/gif\n"; } elsif ($binmode eq 5) { print ONAME "\tDB\t5\t;image/png\n"; } elsif ($binmode eq 6) { print ONAME "\tDB\t6\t;application/octet-stream\n"; } } if($offset eq "") { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0\n\t.word\tend0\n\n"; } else { print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0\n\tDW\tend0\n\n"; } } else { if ($binutils) { print ONAME "\t.byte\t0\t;reserved\n\t.word\tbegin0 + $offset\n\t.word\tend0 + $offset\n\n"; } else {print ONAME "\tDB\t0\t;reserved\n\tDW\tbegin0 + $offset\n\tDW\tend0 + $offset\n\n"; } } } if ($binutils) { print ONAME "\t.section\t$body, #alloc\n\n"; } else { print ONAME "$body\tSEGMENT\tCODE\n\tRSEG\t$body\n\n"; } print ONAME "begin0:\n"; binmode(NAME) ; while (1) { sysread(NAME,$buf,8); if (length($buf) != 0) { if ($binutils) { print ONAME "\t.byte\t"; } else { print ONAME "\tDB\t"; } for ($i=0 ; $i<(length($buf) - 1) ; $i++) { if ($binutils) { printf ONAME "0x%02X, ",unpack("C",substr($buf,$i,1)) ; } else { printf ONAME "0%02Xh, ",unpack("C",substr($buf,$i,1)) ; } } if ($binutils) { printf ONAME "0x%02X\n",unpack("C",substr($buf,$i,1)) ; } else { printf ONAME "0%02Xh\n",unpack("C",substr($buf,$i,1)) ; } } else { last; } } if ($binutils) { print ONAME "end0:\n\t;; end\n"; } else { print ONAME "end0:\n\tend\n"; }}close NAME;close ONAME;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -