table.contact td { vertical-align: top; }
-table.contact { border-collapse: collapse; border-style: solid; border-width: 1px; margin: 8px; }
+table.contact { border-collapse: collapse; border-style: solid; border-width: 1px; }
table.contact A[href] { text-decoration: inherit; /* revoke underline */ }
+/* FIMXE: Reuse .margin-center of My/Web.css */
+.contact,table.contact>caption { margin-left: auto; margin-right: auto; }
print <<"HERE";
-<table width="100%" style="border-style: none;"><tr><td align="center"><table class="contact">
+<table border="0" class="contact">
HERE
my @contact=resume::ResumeJanKratochvil->Contact();
my %keys=map(($_=>1),qw(Name eMail Projects OpenPGP));
}
cluck join(" ","Not found keys:",keys(%keys)) if keys(%keys);
print <<"HERE";
-</table></td></tr></table>
+</table>
HERE
"pipermail_url"=>sub { return "http://".$My::Web::W->{"web_hostname"}."/pipermail/"; },
"heading"=>sub () {
my $r="";
- $r.='<table border="0" width="100%"><tr><td align="center">'."\n";
- $r.='<table border="0" style="font-size: larger;"><tr>'."\n";
- # Do not: <col width="20%" /><col width="50%" /><col width="20%" />
- # as the constant are always bad.
- $r.='<td>'."\n";
- $r.='<table border="1"'
- .' style="border-collapse: collapse; border-style: solid; border-width: 2px;">'
- .'<tr><td style="padding: 5px; font-weight: bold;">'."\n";
- $r.='Jan Kratochvil';
+ $r.='<table border="0" style="font-size: larger;" class="margin-center"><tr>'."\n";
+ # Do not: <col width="20%" /><col width="50%" /><col width="20%" />
+ # as the constant are always bad.
+ $r.='<td>'."\n";
+ $r.='<table border="1"'
+ .' style="border-collapse: collapse; border-style: solid; border-width: 2px;">'
+ .'<tr><td style="padding: 5px; font-weight: bold;">'."\n";
+ $r.='Jan Kratochvil';
# $r.=My::Web::a_href('http://www.jankratochvil.net/','Jan Kratochvil',
# "attr"=>'style="text-decoration: inherit; /* revoke underline */;"');
- $r.='</td></tr></table>';
- $r.='</td>'."\n";
- $r.='<td>'."\n";
- $r.='<table border="1"'
- .' style="text-align: center; border-collapse: collapse; border-style: solid; border-width: 2px;">'
- .'<tr>'."\n";
- my @sections=(
- "/project/"=>"Projects",
- "http://cvs.jankratochvil.net/"=>"CVS",
+ $r.='</td></tr></table>';
+ $r.='</td>'."\n";
+ $r.='<td>'."\n";
+ $r.='<table border="1"'
+ .' style="text-align: center; border-collapse: collapse; border-style: solid; border-width: 2px;">'
+ .'<tr>'."\n";
+ my @sections=(
+ "/project/"=>"Projects",
+ "http://cvs.jankratochvil.net/"=>"CVS",
# "/News.pm"=>"News",
- $resume_url=>"Resume",
- "/Contact.pm"=>"Contact",
- );
- while (@sections) {
- my $section_path=shift @sections;
- my $section_name=shift @sections;
- $r.='<td style="padding: 5px;">';
- $r.=(($My::Web::W->{"section"} || "") eq $section_name ? "<b>$section_name</b>"
- : My::Web::a_href($section_path,$section_name,
- "attr"=>'style="text-decoration: inherit; /* revoke underline */;"'));
- $r.="</td>\n";
- }
- $r.='</tr></table>'."\n";
- $r.='</td>'."\n";
- $r.='</tr></table>'."\n";
- $r.='</td></tr></table>'."\n";
+ $resume_url=>"Resume",
+ "/Contact.pm"=>"Contact",
+ );
+ while (@sections) {
+ my $section_path=shift @sections;
+ my $section_name=shift @sections;
+ $r.='<td style="padding: 5px;">';
+ $r.=(($My::Web::W->{"section"} || "") eq $section_name ? "<b>$section_name</b>"
+ : My::Web::a_href($section_path,$section_name,
+ "attr"=>'style="text-decoration: inherit; /* revoke underline */;"'));
+ $r.="</td>\n";
+ }
+ $r.='</tr></table>'."\n";
+ $r.='</td>'."\n";
+ $r.='</tr></table>'."\n";
if (!$My::Web::W->{"heading_novskip"}) {
$r.="<hr />\n";
$r.=My::Web::vskip("6ex");
my($class,$platform_selected,%args)=@_;
my $r="";
- $r.='<table border="0" width="100%"><tr><td align="center">'."\n";
- $r.='<table><tr>'."\n";
- $r.='<td>';
- $r.='<table border="1" style="border-collapse: collapse; border-style: solid; border-width: 1px;">'."\n";
- $r.='<tr>'."\n";
- $r.='<td style="padding: 5px; font-weight: bold;">'."\n";
- $r.='Projects';
- $r.='</td>'."\n";
- $r.='</tr>'."\n";
- $r.='</table>';
- $r.='</td>';
- $r.='<td>';
- $r.='<table border="1" style="border-collapse: collapse; border-style: solid;">'."\n";
- $r.='<tr>'."\n";
- my @platforms=@platforms;
- while (@platforms) {
- my $platform_sym =shift @platforms;
- my $platform_name=shift @platforms;
- my $chosen=($platform_selected && $platform_selected eq $platform_sym);
- $r.='<td style="padding: 5px;">';
- $r.=a_href((!$platform_selected ? "" : "/project/").'#'.$platform_sym,$platform_name,
- "attr"=>($chosen
- ? 'style="text-decoration: underline; font-weight: bold;"'
- : 'style="text-decoration: inherit; /* revoke underline */"'));
- $r.="</td>\n";
- }
- $r.='</tr>'."\n";
- $r.='</table>'."\n";
- $r.='</td>'."\n";
- $r.='</tr></table>'."\n";
- $r.='</td></tr></table>'."\n";
+ $r.='<table border="0" class="margin-center"><tr>'."\n";
+ $r.='<td>';
+ $r.='<table border="1" style="border-collapse: collapse; border-style: solid; border-width: 1px;">'."\n";
+ $r.='<tr>'."\n";
+ $r.='<td style="padding: 5px; font-weight: bold;">'."\n";
+ $r.='Projects';
+ $r.='</td>'."\n";
+ $r.='</tr>'."\n";
+ $r.='</table>';
+ $r.='</td>';
+ $r.='<td>';
+ $r.='<table border="1" style="border-collapse: collapse; border-style: solid;">'."\n";
+ $r.='<tr>'."\n";
+ my @platforms=@platforms;
+ while (@platforms) {
+ my $platform_sym =shift @platforms;
+ my $platform_name=shift @platforms;
+ my $chosen=($platform_selected && $platform_selected eq $platform_sym);
+ $r.='<td style="padding: 5px;">';
+ $r.=a_href((!$platform_selected ? "" : "/project/").'#'.$platform_sym,$platform_name,
+ "attr"=>($chosen
+ ? 'style="text-decoration: underline; font-weight: bold;"'
+ : 'style="text-decoration: inherit; /* revoke underline */"'));
+ $r.="</td>\n";
+ }
+ $r.='</tr>'."\n";
+ $r.='</table>'."\n";
+ $r.='</td>'."\n";
+ $r.='</tr></table>'."\n";
if (!$args{"novskip"}) {
$r.="<hr />\n";
$r.=My::Web::vskip "6ex";
print $class->platforms($item->{"platform"},"novskip"=>1);
- $r.='<table border="0" width="100%"><tr><td align="center">'."\n";
- $r.='<table border="1" style="border-collapse: collapse; border-style: solid;">'."\n";
- $r.='<tr><td style="font-size: larger;">'."\n";
- $r.=a_href "/project/$name/",$title;
- $r.='</td></tr>'."\n";
- $r.='</table>'."\n";
- $r.='</td></tr></table>'."\n";
+ $r.='<table border="1" style="border-collapse: collapse; border-style: solid;" class="margin-center">'."\n";
+ $r.='<tr><td style="font-size: larger;">'."\n";
+ $r.=a_href "/project/$name/",$title;
+ $r.='</td></tr>'."\n";
+ $r.='</table>'."\n";
$r.=vskip "1ex";
return $r;
}
<h2>Download</h2>
-<table border="0" width="100%"><tr><td align="center">
- <table border="1"><tr><th>Distribution</th>
- <th>Installation Case #1<br />Filesystem and installer<br />(recommended)</th>
- <th>Installation Case #2<br />Manual installation<br />(filesystem, expert user)</th>
- <th>Installation Case #3<br />Command-line client<br />(no filesystem access)</th></tr>
+<table border="1" class="margin-center"><tr><th>Distribution</th>
+ <th>Installation Case #1<br />Filesystem and installer<br />(recommended)</th>
+ <th>Installation Case #2<br />Manual installation<br />(filesystem, expert user)</th>
+ <th>Installation Case #3<br />Command-line client<br />(no filesystem access)</th></tr>
HERE
my %pkg=(
1=>[qw(captive captive-lufs captive-install lufs gnome-vfs-httpcaptive ntfsprogs ntfsprogs-gnomevfs)],
my $ntfsprogs_after=sub ($) {
my($format)=@_;
return if $case!=1;
- return '<table width="100%" border="0"><tr><td align="center"><table width="80%" border="0"><tr><td>'
- .'<hr />requirement: '
- .a_href('http://linux-ntfs.sourceforge.net/downloads.html#downloads','ntfsprogs')
- .' '.$format.' ≥ 1.8.0'
- .'</td></tr></table>'
+ return '<table width="80%" border="0" class="margin-center"><tr><td>'
+ .'<hr />requirement: '
+ .a_href('http://linux-ntfs.sourceforge.net/downloads.html#downloads','ntfsprogs')
+ .' '.$format.' ≥ 1.8.0'
.'</td></tr></table>';
};
for my $dist (@dist) {
print '<tr id="'.$dist->{"id"}.'">';
- print "<td>".$dist->{"name"}."</td>";
+ print '<td align="center">'.$dist->{"name"}."</td>";
for my $casel (1,2,3) {
$case=$casel;
- print "<td>";
+ print '<td align="center">';
print join("<br />",map({ my $pkg=$_;
my($file,$text)=&{$dist->{"out"}}($pkg,@{$version{$pkg}});
(!defined $text ? ($file) || () : (&$a_href_arch("dist/$file",$text)));
my $build_static_basename=(map("$_-".$version{$_}.".tar.gz","build-captive-static"))[0];
print a_href "dist/$build_static_basename",$build_static_basename;
print <<"HERE";
- </td>
- </tr>
- </table>
-</td></tr></table>
+ </td>
+ </tr>
+</table>
@{[ vskip "3ex" ]}
table.mailman > * /* FIXME: What is it? */ > tr > td { padding: 1ex; text-align: center; }
table.download td { padding: 8px; }
table.navigate td { padding-bottom: 1ex; padding-left: 15px; padding-right: 15px; }
+/* FIMXE: Reuse .margin-center of My/Web.css */
+.navigate,table.navigate>caption { margin-left: auto; margin-right: auto; }
+/* FIMXE: Reuse .margin-center of My/Web.css */
+.download,table.download>caption { margin-left: auto; margin-right: auto; }
"no_project_data"=>1,
"css_push"=>"./Index.css",
"project_text_after_title"=>sub { return ""
- .'<table border="0" width="100%"><tr><td align="center">'
- .'<table border="0" class="navigate"><tr>'
- .'<td>• '.a_href('#download','Download').'</td>'
- .'<td>• '.a_href('#news','NEWS').'</td>'
- .'<td>• '.a_href('#testimonials','Testimonials').'</td>'
- .'<td>• '.a_href('#press','Internet Press').'</td>'
- .'<td>• '.a_href('#notes','Installation Notes').'</td>'
- .'<td>• '.a_href('#lists','Mailing Lists').'</td>'
- .'<td>• '.a_href('#seealso','See Also').'</td>'
- .'</tr></table>'
- .'</td></tr></table>';
+ .'<table border="0" class="navigate"><tr>'
+ .'<td>• '.a_href('#download','Download').'</td>'
+ .'<td>• '.a_href('#news','NEWS').'</td>'
+ .'<td>• '.a_href('#testimonials','Testimonials').'</td>'
+ .'<td>• '.a_href('#press','Internet Press').'</td>'
+ .'<td>• '.a_href('#notes','Installation Notes').'</td>'
+ .'<td>• '.a_href('#lists','Mailing Lists').'</td>'
+ .'<td>• '.a_href('#seealso','See Also').'</td>'
+ .'</tr></table>'
},
);
print <<"HERE" if !$W->{"no_job"};
@{[ vskip "3ex" ]}
-<table border="0" width="100%"><tr><td align="center">
- <table border="0" style="margin: 3ex; padding: 2ex; background: #bb8888;">
- <tr><td style="font-size: larger;">
- Looking for a challenging job: @{[ a_href $W->{"resume_url"},"My resume" ]}
- </td></tr>
- </table>
+<table border="0" style="margin: 3ex; padding: 2ex; background: #bb8888;" class="margin-center">
+ <tr><td style="font-size: larger;">
+ Looking for a challenging job: @{[ a_href $W->{"resume_url"},"My resume" ]}
+ </td></tr>
</table>
HERE
<h3>Choose the one preferred installation format:</h3>
-<table border="0" style="text-align: center;" width="100%"><tr><td align="center">
<table border="1" frame="border" rules="rows" style="text-align: center;" class="download">
<tr>
<td>
<td>@{[ a_href 'CVS.pm#source','download link' ]}</td>
</tr>
</table>
-</td></tr></table>
<h4>Development Status</h4>
my($file_base,$text,$comment)=@_;
return <<"HERE";
-<table border="0" width="100%"><tr><td align="center">
- <table border="1">
- <tr><td>@{[ img $file_base,$text ]}</td></tr>
- <tr><td><b>$text</b>@{[ map((!$_ ? "" : "<br />$_"),$comment) ]}</td></tr>
- </table>
-</td></tr></table>
+<table border="1" class="margin-center">
+ <tr><td>@{[ img $file_base,$text ]}</td></tr>
+ <tr><td><b>$text</b>@{[ map((!$_ ? "" : "<br />$_"),$comment) ]}</td></tr>
+</table>
@{[ vskip "3ex" ]}
HERE
}
functionality. Currently implemented functionality statistics are provided
below:</p>
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Function Implementation Types Statistics</caption>
<tr><th>Function type </th><th>Items</th><th>Portion</th></tr>
<tr><td>@{[ a_href 'APITypes.pm#functype_pass','pass' ]} </td><td> 81</td><td> 26%</td></tr>
<tr><td>@{[ a_href 'APITypes.pm#functype_wrap','wrap' ]} </td><td> 2</td><td> 0%</td></tr>
<tr><td>@{[ a_href 'APITypes.pm#functype_native_reactos','native-ReactOS' ]}</td><td> 113</td><td> 36%</td></tr>
<tr><td>@{[ a_href 'APITypes.pm#functype_native_libcaptive','native-own' ]} </td><td> 116</td><td> 38%</td></tr>
- </table></td></tr></table>
+ </table>
@{[ doc_img 'ratio','Functions Reusal Ratio' ]}
@{[ vskip() ]}
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Function Type <span class="constant">pass</span> Characteristics</caption>
<tr><td><span class="fname">captivesym</span> keyword</td><td>pass</td></tr>
<tr><td>Native code function name </td><td>(no implementation)</td></tr>
<tr><td>W32 traced code from W32 function name </td><td>FUNCNAME_cdecl/_stdcall/_fastcall</td></tr>
<tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
<tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
- </table></td></tr></table>
+ </table>
<h2 id="functype_wrap">Wrap of the Original "ntoskrnl.exe" Function</h2>
differ across different <span class="fname">ntoskrnl.exe</span>
versions.</p>
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Function Type <span class="constant">wrap</span> Characteristics</caption>
<tr><td><span class="fname">captivesym</span> keyword</td><td>wrap</td></tr>
<tr><td>Native UNIX wrapping code function name </td><td>FUNCNAME_wrap</td></tr>
<tr><td>W32 traced original code function name </td><td>FUNCNAME_orig</td></tr>
<tr><td>Entry/exit debug tracing from UNIX code </td><td>yes</td></tr>
<tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
- </table></td></tr></table>
+ </table>
<h2 id="functype_native">Native Implementation</h2>
@{[ vskip() ]}
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Function Type <span class="constant">native</span> Characteristics</caption>
<tr><td><span class="fname">captivesym</span> keyword</td><td>(none; just the symbol name)</td></tr>
<tr><td>Native code function name </td><td>FUNCTIONNAME</td></tr>
<tr><td>Native traced code from W32 code func. name </td><td>FUNCTIONNAME_cdecl/_std...</td></tr>
<tr><td>Entry/exit debug tracing from UNIX code </td><td>no</td></tr>
<tr><td>Entry/exit debug tracing from W32 code </td><td>yes</td></tr>
- </table></td></tr></table>
+ </table>
<h2 id="functype_undef">Undefined Function</h2>
<span class="constant">undef</span> type to prevent unresolved symbol
reference.</p>
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Function Type <span class="constant">undef</span> Characteristics</caption>
<tr><td><span class="fname">captivesym</span> keyword</td><td>undef</td></tr>
<tr><td>Native code function name </td><td>(no implementation)</td></tr>
<tr><td>Native traced code function name </td><td>FUNCTIONNAME_cdecl/_stdcall/_fastcall</td></tr>
<tr><td>Debug tracing message from UNIX code </td><td>yes</td></tr>
<tr><td>Debug tracing message from W32 code </td><td>yes</td></tr>
- </table></td></tr></table>
+ </table>
HERE
very well into any role in those two ones. Therefore this project went
its own way of emulation:</p>
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Emulation Projects Characteristics</caption>
<tr>
<th>@{[ a_href '#guestosnote','Guest-OS' ]}</th>
<td>W32 kernel</td>
<td><span class="fname">ntoskrnl.exe</span></td>
</tr>
- </table></td></tr></table>
+ </table>
<dl>
<dt id="guestosnote">Guest-OS</dt>
@{[ doc_img 'fig/calltype_cdecl',
'W32 Calling Convention <span class="constant">cdecl</span> Scheme' ]}
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Calling Convention <span class="constant">cdecl</span> Characteristics</caption>
<tr><td>Arguments freed by </td><td>caller</td></tr>
<tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
<tr><td>Arguments in the registers </td><td>none</td></tr>
<tr><td>GCC attribute </td><td><span class="command">__attribute__((__cdecl__))</span> (default)</td></tr>
- </table></td></tr></table>
+ </table>
<h2 id="calltype_stdcall">W32 Calling Convention "stdcall"</h2>
passed by this convention – use @{[ a_href 'CallType.pm#calltype_cdecl','cdecl' ]}
instead.</p>
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Calling Convention <span class="constant">stdcall</span> Characteristics</caption>
<tr><td>Arguments freed by </td><td>callee</td></tr>
<tr><td>Arguments on the stack </td><td>#0 ... #(n-1)</td></tr>
<tr><td>Arguments in the registers </td><td>none</td></tr>
<tr><td>GCC attribute </td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
- </table></td></tr></table>
+ </table>
<h2 id="calltype_fastcall">W32 Calling Convention "fastcall"</h2>
@{[ doc_img 'fig/calltype_fastcall',
'W32 Calling Convention <span class="constant">fastcall</span> Scheme' ]}
- <table border="0" width="100%"><tr><td align="center"><table border="1">
+ <table border="1" class="margin-center">
<caption>Calling Convention <span class="constant">fastcall</span> Characteristics</caption>
<tr><td>Arguments freed by </td><td>callee</td></tr>
<tr><td>Arguments on the stack </td><td>#2 ... #(n-1)</td></tr>
<tr><td>GCC ≥3.4 attribute </td><td><span class="command">__attribute__((__fastcall__))</span></td></tr>
<tr><td>GCC <3.4 attr. emulation</td><td><span class="command">__attribute__((__stdcall__))</span></td></tr>
<tr><td> </td><td><span class="command">__attribute__((__regparm__(3) /* EAX,EDX,ECX */))</span></td></tr>
- </table></td></tr></table>
+ </table>
HERE
<p>Here is the table for bytes to patch in <tt>WinVNC.exe</tt> from <tt>vnc-3.3.3r9_x86_win32.zip</tt>.
You are not interested in this table if you download the <a href="http://www.realvnc.com/dist/vnc-4.0-x86_win32.exe">already patched
.EXE file</a> referenced in the heading.</p>
-<table border="0" width="100%"><tr><td align="center">
- <table border="1">
+<table border="1" class="margin-center">
<tr><th></th><th>File offset</th><th>Hex bytes</th></tr>
<tr><td>4.0 original</td> <td><tt>00003390</tt></td><td align="right">00 6A 66 6A 69 6A 65 56 8D 8D F8 FE FF FF E8 2D </td></tr>
<tr><td>4.0 'SECRET' patched</td><td><tt>00003390</tt></td><td align="right">00 6A 66 6A 69 6A 65 56 8D 8D F8 FE FF FF <b>EB 03</b> </td></tr>
<tr><td colspan="3" style="border: none;"><hr /></td></tr>
<tr><td>3.3.3r7 original</td> <td><tt>0000C9F0</tt></td><td align="right"> 53 55 56 8B F1 57 8B 46 60 C7 46 68 58 00 00 00</td></tr>
<tr><td>3.3.3r7 'SECRET' patched</td><td><tt>0000C9F0</tt></td><td align="right"><b>C2 08 00</b> 8B F1 57 8B 46 60 C7 46 68 58 00 00 00</td></tr>
- </table>
-</td></tr></table>
+</table>
<p>Here you can check whether your patch was successful:</p>
-<table border="0" width="100%"><tr><td align="center">
- <table border="1">
+<table border="1" class="margin-center">
<tr><th>File from package</th><th>MD5 sum</th></tr>
<tr><td><tt>WinVNC.exe-4.0 </tt>, original</td> <td><tt>7043ddf51d7135c1d1b83b4213dfed61</tt></td></tr>
<tr><td><tt>WinVNC.exe-4.0 </tt>, 'SECRET' patched</td><td><tt>916c82e99e1dc17bebdc31aebc895b52</tt></td></tr>
<tr><td><tt>WinVNC.exe-3.3.3r9</tt>, 'SECRET' patched</td><td><tt>6669d652357a56737b36e2cde0acd473</tt></td></tr>
<tr><td><tt>WinVNC.exe-3.3.3r7</tt>, original</td> <td><tt>d8d9d04901a4896f278d59a1cdc99aef</tt></td></tr>
<tr><td><tt>WinVNC.exe-3.3.3r7</tt>, 'SECRET' patched</td><td><tt>8423b8f9598893b517a4f5eebbf0749b</tt></td></tr>
- </table>
-</td></tr></table>
+</table>
HERE