wok diff man2html/stuff/man2html-slitaz.diff @ rev 25652
Up ntfs-3g (2022.10.3)
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Tue Feb 06 11:59:08 2024 +0000 (9 months ago) |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/man2html/stuff/man2html-slitaz.diff Tue Feb 06 11:59:08 2024 +0000 1.3 @@ -0,0 +1,2357 @@ 1.4 +--- /dev/null 1.5 ++++ b/Makefile 1.6 +@@ -0,0 +1,89 @@ 1.7 ++CFLAGS += -Wall -Wstrict-prototypes -Wmissing-prototypes -DGUNZIP='"gunzip"' `pkg-config --cflags --libs glib-2.0` 1.8 ++# -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -lglib-2.0 1.9 ++OBJECTS = man2html.o cgibase.o abbrev.o strdefs.o 1.10 ++bindir = $(DESTDIR)$(PREFIX)/usr/bin 1.11 ++mandir = $(DESTDIR)$(PREFIX)/usr/share/man 1.12 ++vardir = $(DESTDIR)$(PREFIX)/var 1.13 ++httpdir = $(DESTDIR)$(PREFIX)/home/httpd 1.14 ++cgidir = $(DESTDIR)$(PREFIX)/var/www 1.15 ++sharedir = $(DESTDIR)$(PREFIX)/usr/share/man2html 1.16 ++cgiowner = www 1.17 ++cgigroup = www 1.18 ++CC ?= gcc 1.19 ++ 1.20 ++all: man2html hman 1.21 ++ 1.22 ++man2html: $(OBJECTS) 1.23 ++ $(CC) -o man2html $(OBJECTS) $(CFLAGS) 1.24 ++ 1.25 ++pot: 1.26 ++ mkdir -p po 1.27 ++ xgettext -o po/man2html.pot -k_ -kN_ \ 1.28 ++ --package-name="man2html" \ 1.29 ++ --from-code="UTF-8" \ 1.30 ++ cgibase.c man2html.c hman.sh man.sh 1.31 ++ 1.32 ++msgmerge: 1.33 ++ @for l in $(LINGUAS); do \ 1.34 ++ echo -n "Updating $$l po file."; \ 1.35 ++ msgmerge -U po/$$l.po po/man2html.pot; \ 1.36 ++ done; 1.37 ++ 1.38 ++msgfmt: 1.39 ++ @for l in $(LINGUAS); do \ 1.40 ++ echo "Compiling $$l mo file..."; \ 1.41 ++ mkdir -p po/mo/$$l/LC_MESSAGES; \ 1.42 ++ msgfmt -o po/mo/$$l/LC_MESSAGES/man2html.mo po/$$l.po; \ 1.43 ++ done; 1.44 ++ 1.45 ++ 1.46 ++# man2html: ../src/version.h 1.47 ++ 1.48 ++# This installs the man2html utility 1.49 ++install: man2html 1.50 ++ mkdir -p $(bindir) 1.51 ++ install -m 755 man2html $(bindir) 1.52 ++ mkdir -p $(mandir)/man1 1.53 ++ install -m 644 man2html.1 $(mandir)/man1/man2html.1 1.54 ++ 1.55 ++install-scripts: install-man-scripts install-glimpse-stuff install-hman 1.56 ++ 1.57 ++# These are the scripts that allow pointing a browser at 1.58 ++# http://localhost/cgi-bin/man/man2html 1.59 ++# to work. 1.60 ++install-man-scripts: 1.61 ++ mkdir -p $(cgidir) 1.62 ++ mkdir -p $(sharedir) 1.63 ++ install -m 755 scripts/cgi-bin/man/* $(cgidir) 1.64 ++ install -m 644 scripts/cgi-aux/man/* $(sharedir) 1.65 ++ install -d -o $(cgiowner) -g $(cgigroup) -m 775 $(vardir)/man2html 1.66 ++# (aux was renamed to cgi-aux since aux causes problems under DOS) 1.67 ++ 1.68 ++# If you have installed glimpse, and have compressed man pages, 1.69 ++# then perhaps you also want these filters. 1.70 ++install-glimpse-stuff: 1.71 ++ install -m 644 glimpse_filters $(vardir)/man2html/.glimpse_filters 1.72 ++ 1.73 ++# In order not to have to type a long command like 1.74 ++# netscape http://localhost/cgi-bin/man/man2html?section+topic 1.75 ++# or 1.76 ++# lynx lynxcgi:/home/httpd/cgi-bin/man/man2html?section+topic 1.77 ++# it is convenient to have some shell script as a wrapper. 1.78 ++# The script hman can be aliased to man. It uses an environment 1.79 ++# variable MANHTMLPAGER to find out which browser you use, and 1.80 ++# you can set MANHTMLHOST if the pages are not on localhost. 1.81 ++hman: hman.sh 1.82 ++ rm -f hman 1.83 ++ sed -e 's,%version%,1.6g-7,' hman.sh > hman 1.84 ++ 1.85 ++install-hman: hman 1.86 ++ install -m 555 hman $(bindir)/hman 1.87 ++ install -m 644 hman.1 $(mandir)/man1/hman.1 1.88 ++ 1.89 ++clean: 1.90 ++ rm -f core hman man2html $(OBJECTS) *~ 1.91 ++ 1.92 ++spotless: clean 1.93 ++ rm -f Makefile 1.94 ++ 1.95 ++$(OBJECTS): defs.h 1.96 +--- a/abbrev.c 1.97 ++++ b/abbrev.c 1.98 +@@ -27,7 +27,7 @@ 1.99 + "SSO", "System Services Overview", 1.100 + "TEXT", "Editing Text Files", 1.101 + "DOCS", "Formatting Documents", 1.102 +- "TROFF", "Using <B>nroff</B> and <B>troff</B>", 1.103 ++ "TROFF", "Using <b>nroff</b> and <b>troff</b>", 1.104 + "INDEX", "Global Index", 1.105 + "CPG", "C Programmer's Guide", 1.106 + "CREF", "C Reference Manual", 1.107 +@@ -46,7 +46,7 @@ 1.108 + "CGI", "SunCGI Reference Manual", 1.109 + "CORE", "SunCore Reference Manual", 1.110 + "4ASSY", "Sun-4 Assembly Language Reference", 1.111 +- "SARCH", "<FONT SIZE=\"-1\">SPARC</FONT> Architecture Manual", 1.112 ++ "SARCH", "SPARC Architecture Manual", 1.113 + "KR", "The C Programming Language", 1.114 + 0, 0 }; 1.115 + 1.116 +--- a/cgibase.c 1.117 ++++ b/cgibase.c 1.118 +@@ -8,6 +8,8 @@ 1.119 + #include <ctype.h> /* tolower() */ 1.120 + #include <string.h> /* strlen() */ 1.121 + #include "defs.h" 1.122 ++#include <glib.h> 1.123 ++#include <glib/gi18n.h> 1.124 + 1.125 + /* 1.126 + * The default is to use cgibase. With relative html style 1.127 +@@ -21,8 +23,8 @@ 1.128 + * and uses lynx, and we use lynxcgi:/usr/lib/cgi-bin. 1.129 + */ 1.130 + 1.131 +-static char *man2htmlpath = "/cgi-bin/man/man2html"; /* default */ 1.132 +-static char *cgibase_format = "http://%s"; /* host.domain:port */ 1.133 ++static char *man2htmlpath = ""; /* default */ 1.134 ++static char *cgibase_format = "%s"; /* host.domain:port */ 1.135 + static char *cgibase_ll_format = "lynxcgi:%s"; /* directory */ 1.136 + static char *cgibase = ""; /* default */ 1.137 + 1.138 +@@ -68,76 +70,46 @@ 1.139 + relat_html_style = 1; 1.140 + } 1.141 + 1.142 +-/* What shall we say in case of relat_html_style? */ 1.143 +-static char *signature = "<HR>\n" 1.144 +-"This document was created by\n" 1.145 +-"<A HREF=\"%s%s\">man2html</A>,\n" 1.146 +-"using the manual pages.<BR>\n" 1.147 +-"%s\n"; 1.148 +- 1.149 +-#define TIMEFORMAT "%T GMT, %B %d, %Y" 1.150 +-#define TIMEBUFSZ 500 1.151 +- 1.152 + void print_sig() 1.153 + { 1.154 +- char timebuf[TIMEBUFSZ]; 1.155 +- struct tm *timetm; 1.156 +- time_t now; 1.157 +- 1.158 +- timebuf[0] = 0; 1.159 +-#ifdef TIMEFORMAT 1.160 +- sprintf(timebuf, "Time: "); 1.161 +- now=time(NULL); 1.162 +- timetm=gmtime(&now); 1.163 +- strftime(timebuf+6, TIMEBUFSZ-6, TIMEFORMAT, timetm); 1.164 +- timebuf[TIMEBUFSZ-1] = 0; 1.165 +-#endif 1.166 +- printf(signature, cgibase, man2htmlpath, timebuf); 1.167 ++ printf("</section>\n<footer>\n<p>%s</p>\n</footer>\n", 1.168 ++ _("This document was created by <b>man2html</b> using the manual pages.")); 1.169 + } 1.170 + 1.171 + void 1.172 + include_file_html(char *g) { 1.173 +- printf("<A HREF=\"file:///usr/include/%s\">%s</A>>", g,g); 1.174 ++ printf("<a href=\"file:///usr/include/%s\">%s</a>>", g,g); 1.175 + } 1.176 + 1.177 + void 1.178 + man_page_html(char *sec, char *h) { 1.179 +- if (relat_html_style) { 1.180 +- if (!h) 1.181 +- printf("<A HREF=\"../index.html\">" 1.182 +- "Return to Main Contents</A>"); 1.183 +- else 1.184 +- printf("<A HREF=\"../man%s/%s.%s.html\">%s</A>", 1.185 +- sec, h, sec, h); 1.186 +- } else { 1.187 +- if (!h) 1.188 +- printf("<A HREF=\"%s%s\">Return to Main Contents</A>", 1.189 +- cgibase, man2htmlpath); 1.190 +- else if (!sec) 1.191 +- printf("<A HREF=\"%s%s%c%s\">%s</A>", 1.192 +- cgibase, man2htmlpath, sep, h, h); 1.193 +- else 1.194 +- printf("<A HREF=\"%s%s%c%s+%s\">%s</A>", 1.195 +- cgibase, man2htmlpath, sep, sec, h, h); 1.196 +- } 1.197 ++ if (!h) 1.198 ++ printf("<a href=\"?\">%s</a>", 1.199 ++ _("Return to Main Contents")); 1.200 ++ else if (!sec) 1.201 ++ printf("<a href=\"?%s\">%s</a>", 1.202 ++ h, h); 1.203 ++ else 1.204 ++ printf("<a href=\"?%s+%s\">%s</a>", 1.205 ++ sec, h, h); 1.206 + } 1.207 + 1.208 + void 1.209 + ftp_html(char *f) { 1.210 +- printf("<A HREF=\"ftp://%s\">%s</A>", f, f); 1.211 ++ printf("<a href=\"ftp://%s\">%s</a>", f, f); 1.212 + } 1.213 + 1.214 + void 1.215 + www_html(char *f) { 1.216 +- printf("<A HREF=\"http://%s\">%s</A>", f, f); 1.217 ++ printf("<a href=\"http://%s\">%s</a>", f, f); 1.218 + } 1.219 + 1.220 + void 1.221 + mailto_html(char *g) { 1.222 +- printf("<A HREF=\"mailto:%s\">%s</A>", g, g); 1.223 ++ printf("<a href=\"mailto:%s\">%s</a>", g, g); 1.224 + } 1.225 + 1.226 + void 1.227 + url_html(char *g) { 1.228 +- printf("<A HREF=\"%s\">%s</A>", g, g); 1.229 ++ printf("<a href=\"%s\">%s</a>", g, g); 1.230 + } 1.231 +--- a/hman.sh 1.232 ++++ b/hman.sh 1.233 +@@ -8,99 +8,83 @@ 1.234 + # Usage examples: 1.235 + # hman - get start page 1.236 + # hman man2html - get man page for man2html 1.237 +-# hman 7 locale - get section 7 man page for locale 1.238 ++# hman 7 locale - get section 7 man page for locale 1.239 + # hman 1 - section 1 index of names only 1.240 + # hman 3 index - section 3 index names+descriptions 1.241 + # hman -k editor - search all man pages for some string 1.242 +-# hman -P arena ./twm.man - specify browser; specify man page 1.243 ++# hman -P arena ./twm.man - specify browser; specify man page 1.244 + # 1.245 +-# hman from %version% 1.246 ++# hman from 1.6g-7 1.247 + # 1.248 + 1.249 +-if [ x"$1" = x"-v" ] || [ x"$1" = x"-V" ]; then 1.250 +- echo "`basename $0` from %version%" 1.251 ++. /usr/lib/slitaz/httphelper.sh 1.252 ++. /lib/libtaz.sh 1.253 ++ 1.254 ++# Internationalization 1.255 ++export TEXTDOMAIN='man2html' 1.256 ++_() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; } 1.257 ++ 1.258 ++ 1.259 ++if [ "$1" == '-v' ] || [ "$1" == '-V' ]; then 1.260 ++ echo "$(basename $0) v. 1.6g-slitaz" 1.261 + exit 0 1.262 + fi 1.263 + 1.264 + # The user has to set MANHTMLPAGER (or he will get httpd-free lynx). 1.265 + # Pick your favorite browser: lynx, xmosaic, netscape, arena, amaya, grail, ... 1.266 +-if [ x"$MANHTMLPAGER" = x ] && ! which lynx > /dev/null ; then 1.267 +- HMAN_BROWSER=sensible-browser 1.268 +-else 1.269 +- HMAN_BROWSER=${MANHTMLPAGER-lynxcgi} 1.270 +-fi 1.271 ++HMAN_BROWSER="${MANHTMLPAGER:-tazweb}" 1.272 + 1.273 +-# 1.274 + # If the man pages are on a remote host, specify it in MANHTMLHOST. 1.275 +-HOST=${MANHTMLHOST-localhost} 1.276 ++HOST=${MANHTMLHOST:-localhost} 1.277 + 1.278 + # Perhaps the browser was specified on the command line? 1.279 +-if [ "$#" -gt 1 ] && [ x"$1" = x"-P" ]; then 1.280 +- HMAN_BROWSER="$2" 1.281 +- shift; shift 1.282 ++if [ "$#" -gt 1 ] && [ "$1" == '-P' ]; then 1.283 ++ HMAN_BROWSER="$2" 1.284 ++ shift; shift 1.285 + fi 1.286 + 1.287 + # Perhaps the host was specified on the command line? 1.288 +-if [ "$#" -gt 1 ] && [ x"$1" = x"-H" ]; then 1.289 +- HOST="$2" 1.290 +- shift; shift 1.291 ++if [ "$#" -gt 1 ] && [ "$1" == '-H' ]; then 1.292 ++ HOST="$2" 1.293 ++ shift; shift 1.294 + fi 1.295 + 1.296 +-# Interface to a live (already running) netscape browser. 1.297 +-nsfunc () { 1.298 +- if ( /bin/ps xc | grep -q 'netscape$' ) ; then 1.299 +- if [ -x netscape-remote ] ; then 1.300 +- exec netscape-remote -remote "openURL($1,new_window)" 1.301 +- else 1.302 +- exec netscape -remote "openURL($1,new_window)" 1.303 +- fi 1.304 +- else 1.305 +- netscape $1 & 1.306 +- fi 1.307 +-} 1.308 ++CGI="http://$HOST/man.cgi" 1.309 + 1.310 +-urlencode() { 1.311 +- echo "$@" | perl -pe 'chomp(); s/([^A-Za-z0-9\ \_\-\.\/])/"%" . unpack("H*", $1)/eg; tr/ /+/;' 1.312 ++enc() { 1.313 ++ echo "$@" | sed -e 's|+|%2B|g; s| |+|g'; 1.314 + } 1.315 + 1.316 +- 1.317 +-case "$HMAN_BROWSER" in 1.318 +- lynxcgi) 1.319 +- HMAN_BROWSER=lynx 1.320 +- CG="lynxcgi:/usr/lib/cgi-bin/man" 1.321 +- ;; 1.322 +- netscape) 1.323 +- HMAN_BROWSER=nsfunc 1.324 +- CG="http://$HOST/cgi-bin/man" 1.325 +- ;; 1.326 +- *) 1.327 +- CG="http://$HOST/cgi-bin/man" 1.328 +- ;; 1.329 ++case "$#" in 1.330 ++ 0) 1.331 ++ $HMAN_BROWSER "$CGI";; 1.332 ++ 1) 1.333 ++ case "$1" in 1.334 ++ 1|2|3|4|5|6|7|8|l|n) 1.335 ++ $HMAN_BROWSER "$CGI?$1";; 1.336 ++ /*) 1.337 ++ $HMAN_BROWSER "$CGI?$(enc "$1")";; 1.338 ++ */*) 1.339 ++ $HMAN_BROWSER "$CGI?$(enc "$(realpath "$PWD/$1")")";; 1.340 ++ *) 1.341 ++ $HMAN_BROWSER "$CGI?$(enc "$1")";; 1.342 ++ esac 1.343 ++ ;; 1.344 ++ 2) 1.345 ++# case "$1" in 1.346 ++# -k) 1.347 ++# $HMAN_BROWSER "$CGI?search=$(enc "$2")";; 1.348 ++# *) 1.349 ++# if [ "$2" == 'index' ]; then 1.350 ++# $HMAN_BROWSER "$CGI?whatis=$(enc "$1")" 1.351 ++# else 1.352 ++ $HMAN_BROWSER "$CGI?$(enc "$1 $2")" 1.353 ++# fi 1.354 ++# ;; 1.355 ++# esac 1.356 ++ ;; 1.357 ++ *) 1.358 ++ _ 'bad number of args';; 1.359 + esac 1.360 +- 1.361 +- case "$#" in 1.362 +- 0) $HMAN_BROWSER "$CG/man2html" ;; 1.363 +- 1) case "$1" in 1.364 +- 1|2|3|4|5|6|7|8|l|n) 1.365 +- $HMAN_BROWSER "$CG/mansec?query=$1" ;; 1.366 +- /*) 1.367 +- $HMAN_BROWSER "$CG/man2html?query=`urlencode "$1"`" ;; 1.368 +- */*) 1.369 +- $HMAN_BROWSER "$CG/man2html?query=`urlencode "$PWD/$1"`" ;; 1.370 +- *) 1.371 +- $HMAN_BROWSER "$CG/man2html?query=`urlencode "$1"`" ;; 1.372 +- esac ;; 1.373 +- 2) case "$1" in 1.374 +- -k) 1.375 +- $HMAN_BROWSER "$CG/mansearch?query=`urlencode "$2"`" ;; 1.376 +- *) 1.377 +- if [ "$2" = index ]; then 1.378 +- $HMAN_BROWSER "$CG/manwhatis?query=`urlencode "$1"`" 1.379 +- else 1.380 +- $HMAN_BROWSER "$CG/man2html?query=`urlencode "$1 $2"`" 1.381 +- fi ;; 1.382 +- esac ;; 1.383 +- *) echo "bad number of args" ;; 1.384 +- esac 1.385 + 1.386 + exit 0 1.387 +--- /dev/null 1.388 ++++ b/man.sh 1.389 +@@ -0,0 +1,292 @@ 1.390 ++#!/bin/sh 1.391 ++# man2html cgi script - uses /usr/bin/man2html to format man pages 1.392 ++# aeb@cwi.nl - 980109 1.393 ++# Aleksej Bobylev <al.bobylev@gmail.com>, 2015-2016 1.394 ++ 1.395 ++. /usr/lib/slitaz/httphelper.sh 1.396 ++. /lib/libtaz.sh 1.397 ++ 1.398 ++# Internationalization. 1.399 ++[ -e /etc/locale.conf ] && . /etc/locale.conf 1.400 ++export TEXTDOMAIN='man2html' 1.401 ++export LANG LC_ALL 1.402 ++_() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; } 1.403 ++ 1.404 ++ 1.405 ++SECTIONS="$(_ 'User Commands'):$(_ 'System Calls'):$(_ 'C Library Functions'):\ 1.406 ++$(_ 'Devices and Network Interfaces'):$(_ 'File Formats'):\ 1.407 ++$(_ 'Games and Demos'):$(_ 'Environments, Tables, and Troff Macros'):\ 1.408 ++$(_ 'Maintenance Commands'):$(_ 'All available manual pages')" 1.409 ++ 1.410 ++query="$(GET query)" 1.411 ++if [ -z "$query" ]; then 1.412 ++ set -- $(echo $(GET) | tr '+' ' ') 1.413 ++else 1.414 ++ set -- $(echo $(GET query) | tr '+' ' ') 1.415 ++fi 1.416 ++ 1.417 ++ 1.418 ++if [ $1 == 'css' ]; then 1.419 ++ # post css file on query 1.420 ++ header 'Content-Type: text/css' 1.421 ++ cat /usr/share/doc/slitaz-doc.css 1.422 ++fi 1.423 ++ 1.424 ++if [ $# -eq 1 ]; then 1.425 ++ case $1 in 1.426 ++ 1|2|3|4|5|6|7|8|all) 1.427 ++ if [ "$1" == 'all' ]; then 1.428 ++ sec_n='9'; sec_folder='man?' 1.429 ++ else 1.430 ++ sec_n="$1"; sec_folder="man$1" 1.431 ++ fi 1.432 ++ sec_desc=$(echo "$SECTIONS" | cut -d':' -f $sec_n) 1.433 ++ header 1.434 ++ cat <<EOT 1.435 ++<!DOCTYPE html> 1.436 ++<html> 1.437 ++<head> 1.438 ++ <title>$1. $sec_desc</title> 1.439 ++ <link rel="stylesheet" href="?css"> 1.440 ++</head> 1.441 ++<body><header><h1>$(_ 'Section %s: %s' $1 "$sec_desc")</h1></header> 1.442 ++ <section><header>$(_ 'Manual Pages')</header> 1.443 ++ <p> 1.444 ++EOT 1.445 ++ 1.446 ++ case $1 in 1.447 ++ 1) _ "Section 1 of the manual describes user commands and tools, for example, file \ 1.448 ++manipulation tools, shells, compilers, web browsers, file and image viewers and editors, and so \ 1.449 ++on.";; 1.450 ++ 2) _ "Section 2 of the manual describes the Linux system calls. A system call is \ 1.451 ++an entry point into the Linux kernel.";; 1.452 ++ 3) _ "Section 3 of the manual describes all library functions excluding the \ 1.453 ++library functions (system call wrappers) described in Section 2, which implement system calls.";; 1.454 ++ 4) _ "Section 4 of the manual describes special files (devices).";; 1.455 ++ 5) _ "Section 5 of the manual describes various file formats, as well as the \ 1.456 ++corresponding C structures, if any.";; 1.457 ++ 6) _ "Section 6 of the manual describes all the games and funny little programs \ 1.458 ++available on the system.";; 1.459 ++ 7) _ "Section 7 of the manual provides overviews on various topics, and describes \ 1.460 ++conventions and protocols, character set standards, the standard filesystem layout, and \ 1.461 ++miscellaneous other things.";; 1.462 ++ 8) _ "Section 8 of the manual describes commands which either can be or are used \ 1.463 ++only by the superuser, like system-administration commands, daemons, and hardware-related \ 1.464 ++commands.";; 1.465 ++ esac 1.466 ++ 1.467 ++ [ "$1" != 'all' ] && echo "<b><a href=\"?intro.$1\">intro</a></b>($1)" 1.468 ++ echo '</p>' 1.469 ++ 1.470 ++ temp="$(mktemp)"; temp2="$(mktemp)" 1.471 ++ for dir in $(find /usr/share/man -type d -name "$sec_folder"); do 1.472 ++ ls $dir | sed 's|\.\([0-9]\)\.*[bgx]*z*2*$|:\1|' 1.473 ++ # fix sorting 'feature': leading '_' always ignored by `sort` 1.474 ++ done | sed 's|_|zzzzzzzz|g' | sort -fu | sed 's|zzzzzzzz|_|g' | \ 1.475 ++ awk -F' ' -vtemp="$temp" -vtemp2="$temp2" ' 1.476 ++ { 1.477 ++ split($1, man, ":"); 1.478 ++ 1.479 ++ letter = tolower(substr(man[1], 1, 1)); 1.480 ++ if (letter != last_letter) { 1.481 ++ last_letter = letter; 1.482 ++ letter_index[++num_letters] = letter; 1.483 ++ print "<h3 id=\"l" letter "\">" toupper(letter) "</h3>" > temp; 1.484 ++ } 1.485 ++ lnk = man[1]; gsub("+", "%2b", lnk); 1.486 ++ printf "<b><a href=\"?%s.%s\">%s</a></b>(%s) ", lnk, man[2], man[1], man[2] > temp; 1.487 ++ } 1.488 ++ END { 1.489 ++ # Print out alphabetic quick index and other links 1.490 ++ for (i = 1; i <= num_letters; i++) { 1.491 ++ print "<a href=\"#l" letter_index[i] section "\">" toupper(letter_index[i]) "</a>" > temp2; 1.492 ++ } 1.493 ++ } 1.494 ++ ' 1.495 ++ if [ -s "$temp" ]; then 1.496 ++ echo '<hr>'; cat "$temp2"; echo '<hr>' 1.497 ++ cat "$temp" 1.498 ++ echo '<hr>'; cat "$temp2"; echo '<hr>' 1.499 ++ fi 1.500 ++ 1.501 ++ rm -f "$temp" "$temp2" 1.502 ++ 1.503 ++ cat <<EOT 1.504 ++ </section> 1.505 ++ <section><header>$(_ 'Sections')</header> 1.506 ++ <ol> 1.507 ++EOT 1.508 ++ for i in $(seq 8); do 1.509 ++ sec_desc=$(echo "$SECTIONS" | cut -d':' -f $i) 1.510 ++ echo "<li><a href=\"?$i\">$sec_desc</a></li>" 1.511 ++ done 1.512 ++ cat <<EOT 1.513 ++ </ol> 1.514 ++ <p><a href="?all">$(_ 'All Sections')</a></p> 1.515 ++</section> 1.516 ++ 1.517 ++</body> 1.518 ++</html> 1.519 ++EOT 1.520 ++ exit 0 1.521 ++ ;; 1.522 ++ esac 1.523 ++fi 1.524 ++ 1.525 ++# Find the required page - expect to be called with "man2html [sec] page". 1.526 ++# There may a prefixed "-M manpath" option. 1.527 ++ 1.528 ++if [ $# -ge 2 -a "$1" == '-M' ]; then 1.529 ++ MANPATH="$2" 1.530 ++ export MANPATH 1.531 ++ shift; shift 1.532 ++ MP=' using the given MANPATH' 1.533 ++else 1.534 ++ MP='' 1.535 ++fi 1.536 ++ 1.537 ++ 1.538 ++# If no arguments given, show a start page. 1.539 ++ 1.540 ++if [ $# -eq 0 ]; then 1.541 ++ header 1.542 ++ cat <<EOT 1.543 ++<!DOCTYPE html> 1.544 ++<html> 1.545 ++<head> 1.546 ++ <meta charset="UTF-8"> 1.547 ++ <title>$(_ 'Manual Pages - Main Contents')</title> 1.548 ++ <link rel="stylesheet" href="?css"> 1.549 ++</head> 1.550 ++<body> 1.551 ++<header><h1>$(_ 'Manual Pages - Main Contents')</h1></header> 1.552 ++<section><header>$(_ 'Name and Section lookup')</header> 1.553 ++ <form method="GET"> 1.554 ++ <input name="query" size="40"> 1.555 ++ <button type="submit">$(_ 'Search')</button> 1.556 ++ </form> 1.557 ++ <p>$(_ "You can enter a program name, possibly preceded by the section, the directories to search \ 1.558 ++(with -M) or a full name. For example:")</p> 1.559 ++ 1.560 ++ <ul> 1.561 ++ <li><tt>find</tt></li> 1.562 ++ <li><tt>1 find</tt></li> 1.563 ++ <li><tt>-M /usr/share/man:/opt/man:/usr/local/share/man find</tt></li> 1.564 ++ <li><tt>/usr/share/man/man1/gperf.1</tt></li> 1.565 ++ </ul> 1.566 ++</section> 1.567 ++ 1.568 ++<section><header>$(_ 'Index of pages')</header> 1.569 ++ 1.570 ++ <ol> 1.571 ++EOT 1.572 ++ for i in $(seq 8); do 1.573 ++ sec_desc=$(echo "$SECTIONS" | cut -d':' -f $i) 1.574 ++ echo "<li><a href=\"?$i\">$sec_desc</a></li>" 1.575 ++ done 1.576 ++ cat <<EOT 1.577 ++ </ol> 1.578 ++ <p><a href="?all">$(_ 'All Sections')</a></p> 1.579 ++</section> 1.580 ++ 1.581 ++<footer> 1.582 ++ <p>$(_ 'The original man2html program and scripts are due to %s and %s.' \ 1.583 ++ '<a href="http://wsinwp01.win.tue.nl:1234/index.html">Richard Verhoeven</a>' \ 1.584 ++ '<a href="mailto:michael@actrix.gen.nz">Michael Hamilton</a>') 1.585 ++ $(_ 'This version is from %s maintained by %s.' 'man-1.6g' \ 1.586 ++ '<a href="mailto:flucifredi@acm.org">Federico Lucifredi</a>')</p> 1.587 ++</footer> 1.588 ++</body> 1.589 ++</html> 1.590 ++EOT 1.591 ++ exit 0 1.592 ++fi 1.593 ++ 1.594 ++if [ $# -gt 2 ]; then 1.595 ++ man2html -E "man2html: bad invocation: too many arguments" 1.596 ++ exit 0 1.597 ++fi 1.598 ++ 1.599 ++# A single argument may be an explicitly give path name 1.600 ++# Otherwise, find it 1.601 ++ 1.602 ++if [ $# -eq 1 ]; then 1.603 ++ arg=${1//%2b/+} 1.604 ++ case "$arg" in 1.605 ++ /*) PAGE="$arg";; 1.606 ++ *.*) PAGE=$(find /usr/share/man \( -type f -o -type l \) \( -name "$arg" -o -name "$arg.gz" -o -name "$arg.bz2" -o -name "$arg.xz" \));; 1.607 ++ *) PAGE=$(find /usr/share/man \( -type f -o -type l \) \( -name "$arg.*" -o -name "$arg.*.gz" -o -name "$arg.*.bz2" -o -name "$arg.*.xz" \));; 1.608 ++ esac 1.609 ++else 1.610 ++ arg=${2//%2b/+} 1.611 ++ PAGE="$( 1.612 ++ for dir in $(find /usr/share/man -type d -name man$1); do 1.613 ++ find $dir \( -type f -o -type l \) -name "$arg.$1*" 1.614 ++ done)" 1.615 ++fi 1.616 ++ 1.617 ++if [ -z "$PAGE" ]; then 1.618 ++ complaint="$(_ 'Cannot find a page')" 1.619 ++ if [ $# -eq 1 ]; then 1.620 ++ complaint="$(_ 'Cannot find a page for <b>%s</b> %s' $1 $MP)" 1.621 ++ else 1.622 ++ complaint="$(_ 'Cannot find a page for <b>%s</b> in section <b>%s</b> %s') $2 $1 $MP" 1.623 ++ fi 1.624 ++ man2html -E "<p>$complaint</p>" 1.625 ++ exit 0 1.626 ++fi 1.627 ++ 1.628 ++if [ "$(echo "$PAGE" | wc -l)" -gt 1 ]; then 1.629 ++ header 1.630 ++ cat <<EOT 1.631 ++<!DOCTYPE html> 1.632 ++<html><head><title>$(_ 'Multiple pages')</title> 1.633 ++<link rel="stylesheet" href="?css"></link></head> 1.634 ++<body><header><h1>$(_ 'Multiple pages found')</h1></header> 1.635 ++ <section> 1.636 ++ <ul> 1.637 ++EOT 1.638 ++ echo "$PAGE" | awk -F'/' '{ 1.639 ++ if ($5 ~ "man") { 1.640 ++ split($6, man, "."); 1.641 ++ printf "<li><a href=\"?%s\">%s</a> (%s)</li>\n", $0, man[1], man[2]; 1.642 ++ } else { 1.643 ++ split($7, man, "."); 1.644 ++ printf "<li><a href=\"?%s\">%s</a> (%s) — %s</li>\n", $0, man[1], man[2], $5; 1.645 ++ } 1.646 ++ }' 1.647 ++ sed 's|^.*$|<li><a href="?&">&</a></li>|' 1.648 ++ echo '</ul></section></body></html>' 1.649 ++ exit 0 1.650 ++fi 1.651 ++ 1.652 ++if [ -r "$PAGE" ]; then 1.653 ++ tmpman="$(mktemp)" 1.654 ++ # Unpack man page 1.655 ++ case "$PAGE" in 1.656 ++ *.gz) zcat "$PAGE" > "$tmpman";; 1.657 ++ *.bz2) bzcat "$PAGE" > "$tmpman";; 1.658 ++ *.xz) xzcat "$PAGE" > "$tmpman";; 1.659 ++ *) cp "$PAGE" "$tmpman";; 1.660 ++ esac 1.661 ++ 1.662 ++ # Check for link 1.663 ++ line="$(fgrep -v '.\"' "$tmpman" | head -n1)" 1.664 ++ case "$line" in 1.665 ++ .so*) 1.666 ++ link="$(echo "$line" | cut -d'/' -f2)" 1.667 ++ header "HTTP/1.1 301 Moved Permanently" \ 1.668 ++ "Location: ?$link" 1.669 ++ ;; 1.670 ++ *) 1.671 ++ # Convert page to HTML 1.672 ++ man2html "$tmpman" 1.673 ++ ;; 1.674 ++ esac 1.675 ++ 1.676 ++ # Clean 1.677 ++ rm "$tmpman" 1.678 ++else 1.679 ++ man2html -E "Strange... Cannot find (or read) $PAGE." 1.680 ++fi 1.681 ++exit 0 1.682 +--- a/man2html.c 1.683 ++++ b/man2html.c 1.684 +@@ -21,14 +21,17 @@ 1.685 + #include <ctype.h> 1.686 + #include <sys/stat.h> 1.687 + #include "defs.h" 1.688 +-#include "../src/version.h" 1.689 ++#include "version.h" 1.690 ++#include <glib.h> 1.691 ++#include <glib/gi18n.h> 1.692 ++#define GETTEXT_PACKAGE "man2html" 1.693 + 1.694 + /* BSD mandoc Bd/Ed example(?) blocks */ 1.695 + #define BD_LITERAL 1 1.696 + #define BD_INDENT 2 1.697 + 1.698 + #define SIZE(a) (sizeof(a)/sizeof(*a)) 1.699 +-#define DOCTYPE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" 1.700 ++#define DOCTYPE "<!DOCTYPE html>\n" 1.701 + #define CONTENTTYPE "Content-type: text/html; charset=UTF-8\n\n" 1.702 + 1.703 + static char NEWLINE[2]="\n"; 1.704 +@@ -58,28 +61,13 @@ 1.705 + 1.706 + static char charb[3]; 1.707 + 1.708 +-#ifdef GUNZIP 1.709 +-/* from src/utils.c */ 1.710 +-static int 1.711 +-is_shell_safe(const char *ss, int quoted) { 1.712 +- char *bad = " ;'\\\"<>|"; 1.713 +- char *p; 1.714 + 1.715 +- if (quoted) 1.716 +- bad++; /* allow a space inside quotes */ 1.717 +- for (p = bad; *p; p++) 1.718 +- if (strchr(ss, *p)) 1.719 +- return 0; 1.720 +- return 1; 1.721 +-} 1.722 +-#endif 1.723 +- 1.724 + /* reads the entire manpage into buffer *buf and returns number of chars read */ 1.725 + static int 1.726 + read_manpage_into_buffer(char *path, char **buf) { 1.727 + int compressed = 0; 1.728 + FILE * f = NULL; 1.729 +- char * ext; 1.730 ++ /* char * ext; */ 1.731 + int l = 0; 1.732 + struct stat stbuf; 1.733 + 1.734 +@@ -94,26 +82,6 @@ 1.735 + char * tmp = NULL; 1.736 + char * command = NULL; 1.737 + char * openpath = path; 1.738 +-#ifdef GUNZIP 1.739 +- 1.740 +- if (is_shell_safe(openpath, 1)) { 1.741 +- ext = strrchr(openpath, '.'); 1.742 +- compressed = (ext && !strcmp(ext, ".gz")); 1.743 +- 1.744 +- if (!compressed && stat(openpath, &stbuf)) { 1.745 +- tmp = (char*) xmalloc(strlen(path) + 4); 1.746 +- sprintf(tmp, "%s.gz", path); 1.747 +- if ((compressed = !stat(tmp, &stbuf))) 1.748 +- openpath = tmp; 1.749 +- } 1.750 +- } 1.751 +- 1.752 +- if (compressed) { 1.753 +- command = (char*) xmalloc(strlen(openpath) + sizeof(GUNZIP) + 4); 1.754 +- sprintf(command, GUNZIP " '%s'", openpath); 1.755 +- f = popen(command, "r"); 1.756 +- } else 1.757 +-#endif 1.758 + f = fopen(openpath, "r"); 1.759 + 1.760 + if (tmp) free(tmp); 1.761 +@@ -170,7 +138,7 @@ 1.762 + 1.763 + h = chardef; 1.764 + if (h->nr != V('*','*')) { 1.765 +- printf("chardef corrupted\n"); 1.766 ++ printf("%s\n", _("chardef corrupted")); 1.767 + exit(1); 1.768 + } 1.769 + 1.770 +@@ -216,7 +184,7 @@ 1.771 + ** Add the links to the output. 1.772 + ** At the moment the following are recognized: 1.773 + ** 1.774 +- ** name(*) -> ../man?/name.* 1.775 ++ ** name(*) -> ?name.* 1.776 + ** method://string -> method://string 1.777 + ** www.host.name -> http://www.host.name 1.778 + ** ftp.host.name -> ftp://ftp.host.name 1.779 +@@ -453,8 +421,8 @@ 1.780 + #define DL 1 1.781 + #define UL 2 1.782 + #define OL 3 1.783 +-static char *dl_open[4] = { "", "<DL COMPACT>\n", "<UL>", "<OL>" }; 1.784 +-static char *dl_close[4] = { "", "</DL>\n", "</UL>", "</OL>" }; 1.785 ++static char *dl_open[4] = { "", "<dl compact>\n", "<ul>", "<ol>" }; 1.786 ++static char *dl_close[4] = { "", "</dl>\n", "</ul>", "</ol>" }; 1.787 + 1.788 + static inline void 1.789 + dl_begin(void) { 1.790 +@@ -462,7 +430,7 @@ 1.791 + out_html(dl_open[DL]); 1.792 + dl_set[itemdepth]=DL; 1.793 + } 1.794 +- out_html("<DT>"); 1.795 ++ out_html("<dt>"); 1.796 + } 1.797 + 1.798 + static inline void 1.799 +@@ -481,14 +449,14 @@ 1.800 + itemdepth++; 1.801 + if (itemdepth < SIZE(dl_set)) 1.802 + dl_set[itemdepth]=noDL; 1.803 +- out_html("<DL COMPACT><DT><DD>"); 1.804 ++ out_html("<dl compact><dt><dd>"); 1.805 + } 1.806 + 1.807 + static inline void 1.808 + dl_endlevel(void) { 1.809 + if (itemdepth) { 1.810 + dl_end(); 1.811 +- out_html("</DL>\n"); 1.812 ++ out_html("</dl>\n"); 1.813 + itemdepth--; 1.814 + } 1.815 + } 1.816 +@@ -538,12 +506,12 @@ 1.817 + 1.818 + #define FO0 "" 1.819 + #define FC0 "" 1.820 +-#define FO1 "<I>" 1.821 +-#define FC1 "</I>" 1.822 +-#define FO2 "<B>" 1.823 +-#define FC2 "</B>" 1.824 +-#define FO3 "<TT>" 1.825 +-#define FC3 "</TT>" 1.826 ++#define FO1 "<i>" 1.827 ++#define FC1 "</i>" 1.828 ++#define FO2 "<b>" 1.829 ++#define FC2 "</b>" 1.830 ++#define FO3 "<tt>" 1.831 ++#define FC3 "</tt>" 1.832 + 1.833 + char *switchfont[16] = { "" , FC0 FO1, FC0 FO2, FC0 FO3, 1.834 + FC1 FO0, "" , FC1 FO2, FC1 FO3, 1.835 +@@ -588,14 +556,16 @@ 1.836 + i=current_font; 1.837 + sizebuf[0]=0; 1.838 + strcat(sizebuf, change_to_font(0)); 1.839 +- if (current_size) strcat(sizebuf, "</FONT>"); 1.840 ++ if (current_size) strcat(sizebuf, "</span>"); 1.841 + current_size=nr; 1.842 + if (nr) { 1.843 + int l; 1.844 +- strcat(sizebuf, "<FONT SIZE=\""); 1.845 ++ strcat(sizebuf, "<span style=\"font-size: "); 1.846 + l=strlen(sizebuf); 1.847 + if (nr>0) sizebuf[l++]='+'; else sizebuf[l++]='-',nr=-nr; 1.848 + sizebuf[l++]=nr+'0'; 1.849 ++ sizebuf[l++]='p'; 1.850 ++ sizebuf[l++]='t'; 1.851 + sizebuf[l++]='"'; 1.852 + sizebuf[l++]='>'; 1.853 + sizebuf[l]=0; 1.854 +@@ -775,7 +745,7 @@ 1.855 + skip_escape=exskipescape; 1.856 + intresult=j; 1.857 + break; 1.858 +- case 'l': h="<HR>"; curpos=0; 1.859 ++ case 'l': h="<hr>"; curpos=0; 1.860 + case 'b': 1.861 + case 'v': 1.862 + case 'x': 1.863 +@@ -812,7 +782,7 @@ 1.864 + case 'c': no_newline_output=1; break; 1.865 + case '{': newline_for_fun++; h="";break; 1.866 + case '}': if (newline_for_fun) newline_for_fun--; h="";break; 1.867 +- case 'p': h="<BR>\n";curpos=0; break; 1.868 ++ case 'p': h="<br>\n";curpos=0; break; 1.869 + case 't': h="\t";curpos=(curpos+8)&0xfff8; break; 1.870 + case '<': h="<";curpos++; break; 1.871 + case '>': h=">";curpos++; break; 1.872 +@@ -1021,7 +991,7 @@ 1.873 + out_html(change_to_size(0)); 1.874 + if (!fillout) { 1.875 + fillout=1; 1.876 +- out_html("</PRE>"); 1.877 ++ out_html("</pre>"); 1.878 + } 1.879 + while (*h && *h!='\n') h++; 1.880 + if (h[-1]==';') { 1.881 +@@ -1197,45 +1167,45 @@ 1.882 + currow=currow->prev; 1.883 + } 1.884 + /* produce html output */ 1.885 +- if (center) out_html("<CENTER>"); 1.886 +- if (box==2) out_html("<TABLE BORDER><TR><TD>"); 1.887 +- out_html("<TABLE"); 1.888 ++ if (center) out_html("<div style=\"margin: 0 auto\">"); 1.889 ++ if (box==2) out_html("<table border><tr><td>"); 1.890 ++ out_html("<table"); 1.891 + if (box || border) { 1.892 +- out_html(" BORDER"); 1.893 +- if (!border) out_html("><TR><TD><TABLE"); 1.894 +- if (expand) out_html(" WIDTH=100%"); 1.895 ++ out_html(" border"); 1.896 ++ if (!border) out_html("><tr><td><table"); 1.897 ++ if (expand) out_html(" width=100%"); 1.898 + } 1.899 + out_html(">\n"); 1.900 + currow=layout; 1.901 + while (currow) { 1.902 + j=0; 1.903 +- out_html("<TR VALIGN=top>"); 1.904 ++ out_html("<tr style=\"vertical-align: top\">"); 1.905 + curfield=currow->first; 1.906 + while (curfield) { 1.907 + if (curfield->align!='S' && curfield->align!='^') { 1.908 +- out_html("<TD"); 1.909 ++ out_html("<td"); 1.910 + switch (curfield->align) { 1.911 + case 'N': 1.912 + curfield->space+=4; 1.913 + case 'R': 1.914 +- out_html(" ALIGN=right"); 1.915 ++ out_html(" style=\"text-align: right\""); 1.916 + break; 1.917 + case 'C': 1.918 +- out_html(" ALIGN=center"); 1.919 ++ out_html(" style=\"text-align: center\""); 1.920 + default: 1.921 + break; 1.922 + } 1.923 + if (!curfield->valign && curfield->rowspan>1) 1.924 +- out_html(" VALIGN=center"); 1.925 ++ out_html(" style=\"vertical-align: center\""); 1.926 + if (curfield->colspan>1) { 1.927 + char buf[5]; 1.928 +- out_html(" COLSPAN="); 1.929 ++ out_html(" colspan="); 1.930 + sprintf(buf, "%i", curfield->colspan); 1.931 + out_html(buf); 1.932 + } 1.933 + if (curfield->rowspan>1) { 1.934 + char buf[5]; 1.935 +- out_html(" ROWSPAN="); 1.936 ++ out_html(" rowspan="); 1.937 + sprintf(buf, "%i", curfield->rowspan); 1.938 + out_html(buf); 1.939 + } 1.940 +@@ -1244,8 +1214,8 @@ 1.941 + if (curfield->size) out_html(change_to_size(curfield->size)); 1.942 + if (curfield->font) out_html(change_to_font(curfield->font)); 1.943 + switch (curfield->align) { 1.944 +- case '=': out_html("<HR><HR>"); break; 1.945 +- case '_': out_html("<HR>"); break; 1.946 ++ case '=': out_html("<hr><hr>"); break; 1.947 ++ case '_': out_html("<hr>"); break; 1.948 + default: 1.949 + if (curfield->contents) out_html(curfield->contents); 1.950 + break; 1.951 +@@ -1255,20 +1225,20 @@ 1.952 + if (curfield->font) out_html(change_to_font(0)); 1.953 + if (curfield->size) out_html(change_to_size(0)); 1.954 + if (j>=maxcol && curfield->align>'@' && curfield->align!='_') 1.955 +- out_html("<BR>"); 1.956 +- out_html("</TD>"); 1.957 ++ out_html("<br>"); 1.958 ++ out_html("</td>"); 1.959 + } 1.960 + curfield=curfield->next; 1.961 + } 1.962 +- out_html("</TR>\n"); 1.963 ++ out_html("</tr>\n"); 1.964 + currow=currow->next; 1.965 + } 1.966 +- if (box && !border) out_html("</TABLE>"); 1.967 +- out_html("</TABLE>"); 1.968 +- if (box==2) out_html("</TABLE>"); 1.969 +- if (center) out_html("</CENTER>\n"); 1.970 ++ if (box && !border) out_html("</table>"); 1.971 ++ out_html("</table>"); 1.972 ++ if (box==2) out_html("</table>"); 1.973 ++ if (center) out_html("</div>\n"); 1.974 + else out_html("\n"); 1.975 +- if (!oldfillout) out_html("<PRE>"); 1.976 ++ if (!oldfillout) out_html("<pre>"); 1.977 + fillout=oldfillout; 1.978 + out_html(change_to_size(oldsize)); 1.979 + out_html(change_to_font(oldfont)); 1.980 +@@ -1401,7 +1371,7 @@ 1.981 + case '&': value = (value && value2); break; 1.982 + case ':': value = (value || value2); break; 1.983 + default: fprintf(stderr, 1.984 +- "man2html: Unknown operator %c.\n", oper); 1.985 ++ _("man2html: Unknown operator %c.\n"), oper); 1.986 + } 1.987 + oper=0; 1.988 + } 1.989 +@@ -1489,42 +1459,42 @@ 1.990 + 1.991 + 1.992 + char *section_list[] = { 1.993 +- "1", "User Commands ", 1.994 +- "1C", "User Commands", 1.995 +- "1G", "User Commands", 1.996 +- "1S", "User Commands", 1.997 +- "1V", "User Commands ", 1.998 +- "2", "System Calls", 1.999 +- "2V", "System Calls", 1.1000 +- "3", "C Library Functions", 1.1001 +- "3C", "Compatibility Functions", 1.1002 +- "3F", "Fortran Library Routines", 1.1003 +- "3K", "Kernel VM Library Functions", 1.1004 +- "3L", "Lightweight Processes Library", 1.1005 +- "3M", "Mathematical Library", 1.1006 +- "3N", "Network Functions", 1.1007 +- "3R", "RPC Services Library", 1.1008 +- "3S", "Standard I/O Functions", 1.1009 +- "3V", "C Library Functions", 1.1010 +- "3X", "Miscellaneous Library Functions", 1.1011 +- "4", "Devices and Network Interfaces", 1.1012 +- "4F", "Protocol Families", 1.1013 +- "4I", "Devices and Network Interfaces", 1.1014 +- "4M", "Devices and Network Interfaces", 1.1015 +- "4N", "Devices and Network Interfaces", 1.1016 +- "4P", "Protocols", 1.1017 +- "4S", "Devices and Network Interfaces", 1.1018 +- "4V", "Devices and Network Interfaces", 1.1019 +- "5", "File Formats", 1.1020 +- "5V", "File Formats", 1.1021 +- "6", "Games and Demos", 1.1022 +- "7", "Environments, Tables, and Troff Macros", 1.1023 +- "7V", "Environments, Tables, and Troff Macros", 1.1024 +- "8", "Maintenance Commands", 1.1025 +- "8C", "Maintenance Commands", 1.1026 +- "8S", "Maintenance Commands", 1.1027 +- "8V", "Maintenance Commands", 1.1028 +- "L", "Local Commands", 1.1029 ++ "1", N_("User Commands"), 1.1030 ++ "1C", N_("User Commands"), 1.1031 ++ "1G", N_("User Commands"), 1.1032 ++ "1S", N_("User Commands"), 1.1033 ++ "1V", N_("User Commands"), 1.1034 ++ "2", N_("System Calls"), 1.1035 ++ "2V", N_("System Calls"), 1.1036 ++ "3", N_("C Library Functions"), 1.1037 ++ "3C", N_("Compatibility Functions"), 1.1038 ++ "3F", N_("Fortran Library Routines"), 1.1039 ++ "3K", N_("Kernel VM Library Functions"), 1.1040 ++ "3L", N_("Lightweight Processes Library"), 1.1041 ++ "3M", N_("Mathematical Library"), 1.1042 ++ "3N", N_("Network Functions"), 1.1043 ++ "3R", N_("RPC Services Library"), 1.1044 ++ "3S", N_("Standard I/O Functions"), 1.1045 ++ "3V", N_("C Library Functions"), 1.1046 ++ "3X", N_("Miscellaneous Library Functions"), 1.1047 ++ "4", N_("Devices and Network Interfaces"), 1.1048 ++ "4F", N_("Protocol Families"), 1.1049 ++ "4I", N_("Devices and Network Interfaces"), 1.1050 ++ "4M", N_("Devices and Network Interfaces"), 1.1051 ++ "4N", N_("Devices and Network Interfaces"), 1.1052 ++ "4P", N_("Protocols"), 1.1053 ++ "4S", N_("Devices and Network Interfaces"), 1.1054 ++ "4V", N_("Devices and Network Interfaces"), 1.1055 ++ "5", N_("File Formats"), 1.1056 ++ "5V", N_("File Formats"), 1.1057 ++ "6", N_("Games and Demos"), 1.1058 ++ "7", N_("Environments, Tables, and Troff Macros"), 1.1059 ++ "7V", N_("Environments, Tables, and Troff Macros"), 1.1060 ++ "8", N_("Maintenance Commands"), 1.1061 ++ "8C", N_("Maintenance Commands"), 1.1062 ++ "8S", N_("Maintenance Commands"), 1.1063 ++ "8V", N_("Maintenance Commands"), 1.1064 ++ "L", N_("Local Commands"), 1.1065 + /* for Solaris: 1.1066 + "1", "User Commands", 1.1067 + "1B", "SunOS/BSD Compatibility Package Commands", 1.1068 +@@ -1593,7 +1563,7 @@ 1.1069 + "9s", "DDI and DKI Data Structures", 1.1070 + "L", "Local Commands", 1.1071 + */ 1.1072 +- NULL, "Misc. Reference Manual Pages", 1.1073 ++ NULL, N_("Misc. Reference Manual Pages"), 1.1074 + NULL, NULL 1.1075 + }; 1.1076 + 1.1077 +@@ -1604,7 +1574,7 @@ 1.1078 + 1.1079 + if (!c) return ""; 1.1080 + while (section_list[i] && strcmp(c,section_list[i])) i=i+2; 1.1081 +- if (section_list[i+1]) return section_list[i+1]; 1.1082 ++ if (section_list[i+1]) return _(section_list[i+1]); 1.1083 + else return c; 1.1084 + } 1.1085 + 1.1086 +@@ -1636,10 +1606,10 @@ 1.1087 + if (level != subs) { 1.1088 + manidx_need(6); 1.1089 + if (subs) { 1.1090 +- strcpy(manidx+mip, "</DL>\n"); 1.1091 ++ strcpy(manidx+mip, "</dl>\n"); 1.1092 + mip += 6; 1.1093 + } else { 1.1094 +- strcpy(manidx+mip, "<DL>\n"); 1.1095 ++ strcpy(manidx+mip, "<dl>\n"); 1.1096 + mip += 5; 1.1097 + } 1.1098 + } 1.1099 +@@ -1647,7 +1617,7 @@ 1.1100 + 1.1101 + scan_troff(item, 1, &c); 1.1102 + manidx_need(100 + strlen(c)); 1.1103 +- sprintf(manidx+mip, "<DT><A HREF=\"#%s\">%s</A><DD>\n", label, c); 1.1104 ++ sprintf(manidx+mip, "<dt><a href=\"#%s\">%s</a></dt><dd>\n", label, c); 1.1105 + if (c) free(c); 1.1106 + while (manidx[mip]) mip++; 1.1107 + } 1.1108 +@@ -1834,8 +1804,8 @@ 1.1109 + } 1.1110 + break; 1.1111 + case V('b','r'): 1.1112 +- if (still_dd) out_html("<DD>"); 1.1113 +- else out_html("<BR>\n"); 1.1114 ++ if (still_dd) out_html("<dd>"); 1.1115 ++ else out_html("<br>\n"); 1.1116 + curpos=0; 1.1117 + c=c+j; 1.1118 + if (c[0] == escapesym) { c=scan_escape(c+1); } 1.1119 +@@ -1865,17 +1835,17 @@ 1.1120 + c=skip_till_newline(c); 1.1121 + /* center next i lines */ 1.1122 + if (i>0) { 1.1123 +- out_html("<CENTER>\n"); 1.1124 ++ out_html("<div style=\"margin: 0 auto\">\n"); 1.1125 + while (i && *c) { 1.1126 + char *line=NULL; 1.1127 + c=scan_troff(c,1, &line); 1.1128 +- if (line && strncmp(line, "<BR>", 4)) { 1.1129 ++ if (line && strncmp(line, "<br>", 4)) { 1.1130 + out_html(line); 1.1131 +- out_html("<BR>\n"); 1.1132 ++ out_html("<br>\n"); 1.1133 + i--; 1.1134 + } 1.1135 + } 1.1136 +- out_html("</CENTER>\n"); 1.1137 ++ out_html("</div>\n"); 1.1138 + curpos=0; 1.1139 + } 1.1140 + break; 1.1141 +@@ -1906,7 +1876,7 @@ 1.1142 + if (!fillout) { 1.1143 + out_html(change_to_font(0)); 1.1144 + out_html(change_to_size('0')); 1.1145 +- out_html("</PRE>\n"); 1.1146 ++ out_html("</pre>\n"); 1.1147 + } 1.1148 + curpos=0; 1.1149 + fillout=1; 1.1150 +@@ -1981,7 +1951,7 @@ 1.1151 + if (fillout) { 1.1152 + out_html(change_to_font(0)); 1.1153 + out_html(change_to_size('0')); 1.1154 +- out_html("<PRE>\n"); 1.1155 ++ out_html("<pre>\n"); 1.1156 + } 1.1157 + curpos=0; 1.1158 + fillout=0; 1.1159 +@@ -2002,7 +1972,7 @@ 1.1160 + break; 1.1161 + case V('s','p'): 1.1162 + c=c+j; 1.1163 +- if (fillout) out_html("<P>"); else { 1.1164 ++ if (fillout) out_html("<p>"); else { 1.1165 + out_html(NEWLINE); 1.1166 + NEWLINE[0]='\n'; 1.1167 + } 1.1168 +@@ -2033,30 +2003,15 @@ 1.1169 + *c = 0; 1.1170 + scan_troff(h,1, &name); 1.1171 + if (name[3] == '/') h=name+3; else h=name; 1.1172 +-#if NOCGI 1.1173 +- if (!out_length) { 1.1174 +- char *t,*s; 1.1175 +- t=strrchr(fname, '/'); 1.1176 +- if (!t) t=fname; 1.1177 +- fprintf(stderr, "ln -s %s.html %s.html\n", h, t); 1.1178 +- s=strrchr(t, '.');if (!s) s=t; 1.1179 +- printf(CONTENTTYPE DOCTYPE); 1.1180 +- printf("<HTML><HEAD><TITLE> Man page of %s</TITLE>\n" 1.1181 +- "</HEAD><BODY>\n" 1.1182 +- "See the man page for <A HREF=\"%s.html\">%s</A>.\n" 1.1183 +- "</BODY></HTML>\n", 1.1184 +- s, h, h); 1.1185 +- } else 1.1186 +-#endif 1.1187 + { 1.1188 + /* this works alright, except for section 3 */ 1.1189 + if ((l = read_manpage_into_buffer(h, &buf)) < 0) { 1.1190 + fprintf(stderr, 1.1191 +- "man2html: unable to open or read file %s\n", h); 1.1192 +- out_html("<BLOCKQUOTE>" 1.1193 +- "man2html: unable to open or read file\n"); 1.1194 ++ _("man2html: unable to open or read file %s\n"), h); 1.1195 ++ out_html("<blockquote>"); 1.1196 ++ out_html(_("man2html: unable to open or read file\n")); 1.1197 + out_html(h); 1.1198 +- out_html("</BLOCKQUOTE>\n"); 1.1199 ++ out_html("</blockquote>\n"); 1.1200 + } else { 1.1201 + buf[0]=buf[l]='\n'; 1.1202 + buf[l+1]=buf[l+2]=0; 1.1203 +@@ -2085,7 +2040,7 @@ 1.1204 + #if 0 1.1205 + dl_down(); 1.1206 + #endif 1.1207 +- out_html("<BR>\n"); 1.1208 ++ out_html("<br>\n"); 1.1209 + c=c+j; 1.1210 + c=scan_expression(c, &j); 1.1211 + for (i=0; i<j; i++) out_html(" "); 1.1212 +@@ -2163,7 +2118,7 @@ 1.1213 + if (words) { 1.1214 + scan_troff(wordlist[0], 1,NULL); 1.1215 + } 1.1216 +- out_html("<DD>"); 1.1217 ++ out_html("<dd>"); 1.1218 + curpos = 0; 1.1219 + break; 1.1220 + case V('T','P'): 1.1221 +@@ -2172,7 +2127,7 @@ 1.1222 + /* somewhere a definition ends with '.TP' */ 1.1223 + if (!*c) still_dd=1; else { 1.1224 + c=scan_troff(c,1,NULL); 1.1225 +- out_html("<DD>"); 1.1226 ++ out_html("<dd>"); 1.1227 + } 1.1228 + curpos=0; 1.1229 + break; 1.1230 +@@ -2195,20 +2150,20 @@ 1.1231 + fprintf(idxfile,"\n"); 1.1232 + } 1.1233 + #endif 1.1234 +- out_html("<A NAME=\""); 1.1235 ++ out_html("<span id=\""); 1.1236 + out_html(idxlabel); 1.1237 + /* this will not work in mosaic (due to a bug). 1.1238 + ** Adding ' ' between '>' and '<' solves it, but creates 1.1239 + ** some space. A normal space does not work. 1.1240 + */ 1.1241 +- out_html("\"></A>"); 1.1242 ++ out_html("\"></span>"); 1.1243 + break; 1.1244 + case V('P',' '): 1.1245 + case V('P','\n'): 1.1246 + case V('L','P'): 1.1247 + case V('P','P'): 1.1248 + dl_end(); 1.1249 +- if (fillout) out_html("<P>\n"); else { 1.1250 ++ if (fillout) out_html("<p>\n"); else { 1.1251 + out_html(NEWLINE); 1.1252 + NEWLINE[0]='\n'; 1.1253 + } 1.1254 +@@ -2272,19 +2227,29 @@ 1.1255 + out_html(change_to_size(0)); 1.1256 + if (!fillout) { 1.1257 + fillout=1; 1.1258 +- out_html("</PRE>"); 1.1259 ++ out_html("</pre>"); 1.1260 + } 1.1261 + trans_char(c,'"', '\a'); 1.1262 + add_to_index(mode, c); 1.1263 +- out_html("<A NAME=\""); 1.1264 +- out_html(label); 1.1265 +- /* for mosaic users */ 1.1266 +- if (mode) out_html("\"> </A>\n<H3>"); 1.1267 +- else out_html("\"> </A>\n<H2>"); 1.1268 ++ 1.1269 ++ if (mode) { 1.1270 ++ out_html("<h3 id=\""); 1.1271 ++ out_html(label); 1.1272 ++ out_html("\">"); 1.1273 ++ } else { 1.1274 ++ out_html("</section>\n\n<section id=\""); 1.1275 ++ out_html(label); 1.1276 ++ out_html("\">\n<h2>"); 1.1277 ++ } 1.1278 ++ 1.1279 + mandoc_synopsis = (strncmp(c, "SYNOPSIS", 8) == 0); 1.1280 + c = (mandoc_command ? scan_troff_mandoc : scan_troff)(c,1,NULL); 1.1281 +- if (mode) out_html("</H3>\n"); 1.1282 +- else out_html("</H2>\n"); 1.1283 ++ 1.1284 ++ if (mode) 1.1285 ++ out_html("</h3>\n"); 1.1286 ++ else 1.1287 ++ out_html("</h2>\n"); 1.1288 ++ 1.1289 + curpos=0; 1.1290 + break; 1.1291 + case V('T','S'): 1.1292 +@@ -2315,7 +2280,7 @@ 1.1293 + int skip=0; 1.1294 + output_possible=1; 1.1295 + printf(CONTENTTYPE DOCTYPE); 1.1296 +- out_html("<HTML><HEAD><TITLE>Man page of "); 1.1297 ++ out_html("<html><head>\n<meta charset=\"UTF-8\">\n<title>"); 1.1298 + scan_troff(wordlist[0], 0, &t); 1.1299 + /* we need to remove all html tags */ 1.1300 + for (s=q=t; *s; s++) { 1.1301 +@@ -2324,11 +2289,14 @@ 1.1302 + else if (!skip) *q++ = *s; 1.1303 + } 1.1304 + *q = '\0'; 1.1305 +- out_html(t); 1.1306 ++ char buff[256]; 1.1307 ++ sprintf(buff, _("Man page of %s"), t); 1.1308 ++ out_html(buff); 1.1309 + free(t); 1.1310 +- out_html("</TITLE>\n</HEAD><BODY>\n<H1>"); 1.1311 ++ out_html("</title>\n<link rel=\"stylesheet\" href=\"?css\">\n</head><body>\n<header><h1>"); 1.1312 + scan_troff(wordlist[0], 0, NULL); 1.1313 +- out_html("</H1>\nSection: "); 1.1314 ++ out_html("</h1></header>\n<section>\n"); 1.1315 ++ out_html(_("Section: ")); 1.1316 + if (words>4) 1.1317 + scan_troff(wordlist[4], 0, NULL); 1.1318 + else 1.1319 +@@ -2336,14 +2304,17 @@ 1.1320 + out_html(" ("); 1.1321 + scan_troff(wordlist[1], 0, NULL); 1.1322 + if (words>2) { 1.1323 +- out_html(")<BR>Updated: "); 1.1324 ++ out_html(")<br>"); 1.1325 ++ out_html(_("Updated: ")); 1.1326 + scan_troff(wordlist[2], 1, NULL); 1.1327 + } else out_html(")"); 1.1328 +- out_html("<BR><A HREF=\"#index\">Index</A>\n"); 1.1329 ++ out_html("<br><a href=\"#index\">"); 1.1330 ++ out_html(_("Index")); 1.1331 ++ out_html("</a>\n"); 1.1332 + man_page_html(0,0); /* Return to Main Contents */ 1.1333 + *sl='\n'; 1.1334 +- out_html("<HR>\n"); 1.1335 +- if (mandoc_command) out_html("<BR>BSD mandoc<BR>"); 1.1336 ++ out_html("<hr>\n"); 1.1337 ++ if (mandoc_command) out_html("<br>\nBSD mandoc<br>"); 1.1338 + } 1.1339 + c = sl+1; 1.1340 + } else 1.1341 +@@ -2507,7 +2478,7 @@ 1.1342 + dl_newlevel_type(DL); 1.1343 + if (nl) 1.1344 + *nl = t; 1.1345 +- if (fillout) out_html("<P>\n"); else { 1.1346 ++ if (fillout) out_html("<p>\n"); else { 1.1347 + out_html(NEWLINE); 1.1348 + NEWLINE[0]='\n'; 1.1349 + } 1.1350 +@@ -2518,7 +2489,7 @@ 1.1351 + case V('E','l'): /* BSD mandoc */ 1.1352 + c=c+j; 1.1353 + dl_endlevel_type(); 1.1354 +- if (fillout) out_html("<P>\n"); else { 1.1355 ++ if (fillout) out_html("<p>\n"); else { 1.1356 + out_html(NEWLINE); 1.1357 + NEWLINE[0]='\n'; 1.1358 + } 1.1359 +@@ -2528,7 +2499,7 @@ 1.1360 + case V('I','t'): /* BSD mandoc */ 1.1361 + c=c+j; 1.1362 + if (dl_type(DL)) { 1.1363 +- out_html("<DT>"); 1.1364 ++ out_html("<dt>"); 1.1365 + out_html(change_to_font('B')); 1.1366 + if (*c == '\n') { 1.1367 + /* Don't allow embedded comms after a newline */ 1.1368 +@@ -2543,9 +2514,9 @@ 1.1369 + if (inXo) 1.1370 + still_dd = 1; 1.1371 + else 1.1372 +- out_html("<DD>"); 1.1373 ++ out_html("<dd>"); 1.1374 + } else if (dl_type(UL) || dl_type(OL)) { 1.1375 +- out_html("<LI>"); 1.1376 ++ out_html("<li>"); 1.1377 + c=scan_troff_mandoc(c,1,NULL); 1.1378 + out_html(NEWLINE); 1.1379 + } 1.1380 +@@ -2559,7 +2530,7 @@ 1.1381 + c=c+j; 1.1382 + if (inXo) { 1.1383 + if (still_dd) 1.1384 +- out_html("<DD>"); 1.1385 ++ out_html("<dd>"); 1.1386 + inXo = 0; 1.1387 + } 1.1388 + break; 1.1389 +@@ -2594,12 +2565,12 @@ 1.1390 + case V('D','l'): /* BSD mandoc */ 1.1391 + c=c+j; 1.1392 + out_html(NEWLINE); 1.1393 +- out_html("<BLOCKQUOTE>"); 1.1394 ++ out_html("<blockquote>"); 1.1395 + out_html(change_to_font('L')); 1.1396 + if (*c == '\n') c++; 1.1397 + c=scan_troff_mandoc(c, 1, NULL); 1.1398 + out_html(change_to_font('R')); 1.1399 +- out_html("</BLOCKQUOTE>"); 1.1400 ++ out_html("</blockquote>"); 1.1401 + if (fillout) curpos++; else curpos=0; 1.1402 + break; 1.1403 + case V('B','d'): /* BSD mandoc */ 1.1404 +@@ -2615,14 +2586,14 @@ 1.1405 + mandoc_bd_options = 0; /* Remember options for terminating Bl */ 1.1406 + if (strstr(c, "-offset indent")) { 1.1407 + mandoc_bd_options |= BD_INDENT; 1.1408 +- out_html("<BLOCKQUOTE>\n"); 1.1409 ++ out_html("<blockquote>\n"); 1.1410 + } 1.1411 + if (strstr(c, "-literal") || strstr(c, "-unfilled")) { 1.1412 + if (fillout) { 1.1413 + mandoc_bd_options |= BD_LITERAL; 1.1414 + out_html(change_to_font(0)); 1.1415 + out_html(change_to_size('0')); 1.1416 +- out_html("<PRE>\n"); 1.1417 ++ out_html("<pre>\n"); 1.1418 + } 1.1419 + curpos=0; 1.1420 + fillout=0; 1.1421 +@@ -2637,18 +2608,18 @@ 1.1422 + if (!fillout) { 1.1423 + out_html(change_to_font(0)); 1.1424 + out_html(change_to_size('0')); 1.1425 +- out_html("</PRE>\n"); 1.1426 ++ out_html("</pre>\n"); 1.1427 + } 1.1428 + } 1.1429 + if (mandoc_bd_options & BD_INDENT) 1.1430 +- out_html("</BLOCKQUOTE>\n"); 1.1431 ++ out_html("</blockquote>\n"); 1.1432 + curpos=0; 1.1433 + fillout=1; 1.1434 + c=skip_till_newline(c); 1.1435 + break; 1.1436 + case V('B','e'): /* BSD mandoc */ 1.1437 + c=c+j; 1.1438 +- if (fillout) out_html("<P>"); else { 1.1439 ++ if (fillout) out_html("<p>"); else { 1.1440 + out_html(NEWLINE); 1.1441 + NEWLINE[0]='\n'; 1.1442 + } 1.1443 +@@ -2715,7 +2686,7 @@ 1.1444 + if (fillout) curpos++; else curpos=0; 1.1445 + break; 1.1446 + case V('P','p'): /* BSD mandoc */ 1.1447 +- if (fillout) out_html("<P>\n"); else { 1.1448 ++ if (fillout) out_html("<p>\n"); else { 1.1449 + out_html(NEWLINE); 1.1450 + NEWLINE[0]='\n'; 1.1451 + } 1.1452 +@@ -2726,9 +2697,9 @@ 1.1453 + trans_char(c,'"','\a'); 1.1454 + c=c+j; 1.1455 + if (*c == '\n') c++; 1.1456 +- out_html("``"); 1.1457 ++ out_html("“"); 1.1458 + c=scan_troff_mandoc(c, 1, NULL); 1.1459 +- out_html("''"); 1.1460 ++ out_html("”"); 1.1461 + out_html(NEWLINE); 1.1462 + if (fillout) curpos++; else curpos=0; 1.1463 + break; 1.1464 +@@ -2800,12 +2771,22 @@ 1.1465 + trans_char(c,'"','\a'); 1.1466 + c=c+j; 1.1467 + if (*c == '\n') c++; 1.1468 +- out_html("`"); 1.1469 ++ out_html("‘"); 1.1470 + c=scan_troff_mandoc(c, 1, NULL); 1.1471 +- out_html("'"); 1.1472 ++ out_html("’"); 1.1473 + out_html(NEWLINE); 1.1474 + if (fillout) curpos++; else curpos=0; 1.1475 + break; 1.1476 ++ case V('A','q'): /* BSD mandoc */ 1.1477 ++ trans_char(c,'"','\a'); 1.1478 ++ c=c+j; 1.1479 ++ if (*c == '\n') c++; 1.1480 ++ out_html("⟨"); 1.1481 ++ c=scan_troff_mandoc(c, 1, NULL); 1.1482 ++ out_html("⟩"); 1.1483 ++ out_html(NEWLINE); 1.1484 ++ if (fillout) curpos++; else curpos=0; 1.1485 ++ break; 1.1486 + case V('A','r'): /* BSD mandoc */ 1.1487 + /* parse one line in italics */ 1.1488 + out_html(change_to_font('I')); 1.1489 +@@ -2855,7 +2836,7 @@ 1.1490 + */ 1.1491 + static int count = 0; /* Don't break on the first Nm */ 1.1492 + if (count) { 1.1493 +- out_html("<BR>"); 1.1494 ++ out_html("<br>"); 1.1495 + } else { 1.1496 + char *end, t=0 /* just for gcc */; 1.1497 + end = strchr(c, '\n'); 1.1498 +@@ -3038,7 +3019,7 @@ 1.1499 + if (h[-1] == '\n' && still_dd && isalnum(*h)) { 1.1500 + /* sometimes a .HP request is not followed by a .br request */ 1.1501 + FLUSHIBP; 1.1502 +- out_html("<DD>"); 1.1503 ++ out_html("<dd>"); 1.1504 + curpos=0; 1.1505 + still_dd=0; 1.1506 + } 1.1507 +@@ -3108,12 +3089,12 @@ 1.1508 + curpos++; 1.1509 + } 1.1510 + } else { 1.1511 +- out_html("<TT>"); 1.1512 ++ out_html("<tt>"); 1.1513 + while (curpos < tabstops[curtab]) { 1.1514 + out_html(" "); 1.1515 + curpos++; 1.1516 + } 1.1517 +- out_html("</TT>"); 1.1518 ++ out_html("</tt>"); 1.1519 + } 1.1520 + } 1.1521 + } 1.1522 +@@ -3122,7 +3103,7 @@ 1.1523 + if (*h == ' ' && (h[-1] == '\n' || usenbsp)) { 1.1524 + FLUSHIBP; 1.1525 + if (!usenbsp && fillout) { 1.1526 +- out_html("<BR>"); 1.1527 ++ out_html("<br>"); 1.1528 + curpos=0; 1.1529 + } 1.1530 + usenbsp=fillout; 1.1531 +@@ -3196,13 +3177,13 @@ 1.1532 + 1.1533 + switch(status) { 1.1534 + case 403: 1.1535 +- printf("Status: 403 Forbidden\n"); 1.1536 ++ printf("HTTP/1.1 403 Forbidden\n"); 1.1537 + break; 1.1538 + case 404: 1.1539 +- printf("Status: 404 Not Found\n"); 1.1540 ++ printf("HTTP/1.1 404 Not Found\n"); 1.1541 + break; 1.1542 + case 500: 1.1543 +- printf("Status: 500 Internal Server Error\n"); 1.1544 ++ printf("HTTP/1.1 500 Internal Server Error\n"); 1.1545 + break; 1.1546 + case 0: 1.1547 + default: 1.1548 +@@ -3210,12 +3191,13 @@ 1.1549 + } 1.1550 + 1.1551 + printf(CONTENTTYPE DOCTYPE); 1.1552 +- printf("<HTML><HEAD><TITLE>%s</TITLE></HEAD>\n" 1.1553 +- "<BODY>\n<H1>%s</H1>\n", s, s); 1.1554 ++ printf("<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>%s</title>\n" 1.1555 ++ "<link rel=\"stylesheet\" href=\"?css\">\n</head>\n" 1.1556 ++ "<body>\n<header><h1>%s</h1></header>\n<section>\n", s, s); 1.1557 + va_start(p, t); 1.1558 + vfprintf(stdout, t, p); 1.1559 + va_end(p); 1.1560 +- printf("</BODY></HTML>\n"); 1.1561 ++ printf("</section>\n</body></html>\n"); 1.1562 + exit(0); 1.1563 + } 1.1564 + 1.1565 +@@ -3223,8 +3205,8 @@ 1.1566 + xstrdup(const char *s) { 1.1567 + char *p = strdup(s); 1.1568 + if (p == NULL) 1.1569 +- error_page(500, "Out of memory", 1.1570 +- "Sorry, out of memory, aborting...\n"); 1.1571 ++ error_page(500, _("Out of memory"), 1.1572 ++ _("Sorry, out of memory, aborting...\n")); 1.1573 + return p; 1.1574 + } 1.1575 + 1.1576 +@@ -3232,8 +3214,8 @@ 1.1577 + xmalloc(size_t size) { 1.1578 + void *p = malloc(size); 1.1579 + if (p == NULL) 1.1580 +- error_page(500, "Out of memory", 1.1581 +- "Sorry, out of memory, aborting...\n"); 1.1582 ++ error_page(500, _("Out of memory"), 1.1583 ++ _("Sorry, out of memory, aborting...\n")); 1.1584 + return p; 1.1585 + } 1.1586 + 1.1587 +@@ -3241,16 +3223,16 @@ 1.1588 + xrealloc(void *ptr, size_t size) { 1.1589 + void *p = realloc(ptr,size); 1.1590 + if (p == NULL) 1.1591 +- error_page(500, "Out of memory", 1.1592 +- "Sorry, out of memory, aborting...\n"); 1.1593 ++ error_page(500, _("Out of memory"), 1.1594 ++ _("Sorry, out of memory, aborting...\n")); 1.1595 + return p; 1.1596 + } 1.1597 + 1.1598 + static void 1.1599 + usage(void) { 1.1600 +- error_page(500, "man2html: bad invocation", 1.1601 +- "Call: man2html [-l|-h host.domain:port] [-p|-q] [filename]\n" 1.1602 +- "or: man2html -r [filename]\n"); 1.1603 ++ error_page(500, _("man2html: bad invocation"), 1.1604 ++ _("Call: man2html [-l|-h host.domain:port] [-p|-q] [filename]\n" 1.1605 ++ "or: man2html -r [filename]\n")); 1.1606 + } 1.1607 + 1.1608 + static void 1.1609 +@@ -3273,7 +3255,7 @@ 1.1610 + } 1.1611 + #if 0 1.1612 + else /* complain or not - this need not be fatal */ 1.1613 +- error_page("Error", "man2html: could not chdir to %s", s); 1.1614 ++ error_page(_("Error"), _("man2html: could not chdir to %s"), s); 1.1615 + #endif 1.1616 + } 1.1617 + } 1.1618 +@@ -3291,6 +3273,11 @@ 1.1619 + */ 1.1620 + int 1.1621 + main(int argc, char **argv) { 1.1622 ++ setlocale (LC_ALL, ""); 1.1623 ++ bindtextdomain (GETTEXT_PACKAGE, "/usr/share/locale"); 1.1624 ++ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 1.1625 ++ textdomain (GETTEXT_PACKAGE); 1.1626 ++ 1.1627 + int l, c; 1.1628 + char *buf, *filename, *fnam = NULL; 1.1629 + 1.1630 +@@ -3309,7 +3296,7 @@ 1.1631 + case 'D': 1.1632 + goto_dir(optarg, 0, 0); break; 1.1633 + case 'E': 1.1634 +- error_page(0, "Error", "%s", optarg); break; 1.1635 ++ error_page(0, _("Error"), "%s", optarg); break; 1.1636 + case 'h': 1.1637 + set_cgibase("localhost"); break; 1.1638 + case 'H': 1.1639 +@@ -3362,7 +3349,7 @@ 1.1640 + 1.1641 + l = read_manpage_into_buffer(fnam, &buf); 1.1642 + if (l < 0) 1.1643 +- error_page(404, "File not found", "Could not open %s\n", fname); 1.1644 ++ error_page(404, _("File not found"), _("Could not open %s\n"), fname); 1.1645 + 1.1646 + buf[0] = '\n'; 1.1647 + buf[l+1] = '\n'; 1.1648 +@@ -3379,34 +3366,34 @@ 1.1649 + out_html(change_to_size(0)); 1.1650 + if (!fillout) { 1.1651 + fillout=1; 1.1652 +- out_html("</PRE>"); 1.1653 ++ out_html("</pre>"); 1.1654 + } 1.1655 + out_html(NEWLINE); 1.1656 + if (output_possible) { 1.1657 + /* for mosaic users */ 1.1658 + if (manidx) { 1.1659 +- printf("<HR>\n<A NAME=\"index\"> </A><H2>Index</H2>\n<DL>\n"); 1.1660 ++ printf("</section>\n\n<section id=\"index\">\n<h2>%s</h2>\n\n<dl>\n", _("Index")); 1.1661 + manidx[mip]=0; 1.1662 + printf("%s", manidx); 1.1663 +- if (subs) printf("</DL>\n"); 1.1664 +- printf("</DL>\n"); 1.1665 ++ if (subs) printf("</dl>\n"); 1.1666 ++ printf("</dl>\n"); 1.1667 + } 1.1668 + print_sig(); 1.1669 +- printf("</BODY>\n</HTML>\n"); 1.1670 ++ printf("</body>\n</html>\n"); 1.1671 + } else { 1.1672 + if (!filename) 1.1673 + filename = fname; 1.1674 + if (*filename == '/') 1.1675 +- error_page(403, "Invalid Man Page", 1.1676 +- "The requested file %s is not a valid (unformatted) " 1.1677 ++ error_page(403, _("Invalid Man Page"), 1.1678 ++ _("The requested file %s is not a valid (unformatted) " 1.1679 + "man page.\nIf the file is a formatted man page, " 1.1680 + "you could try to load the\n" 1.1681 +- "<A HREF=\"file://%s\">plain file</A>.\n", 1.1682 ++ "<a href=\"file://%s\">plain file</a>.\n"), 1.1683 + filename, filename); 1.1684 + else 1.1685 +- error_page(403, "Invalid Man Page", 1.1686 +- "The requested file %s is not a valid (unformatted) " 1.1687 +- "man page.", filename); 1.1688 ++ error_page(403, _("Invalid Man Page"), 1.1689 ++ _("The requested file %s is not a valid (unformatted) " 1.1690 ++ "man page."), filename); 1.1691 + } 1.1692 + if (idxfile) 1.1693 + fclose(idxfile); 1.1694 +--- a/scripts/cgi-bin/man/man2html 1.1695 ++++ b/scripts/cgi-bin/man/man2html 1.1696 +@@ -8,11 +8,11 @@ 1.1697 + 1.1698 + # Do we need lynxcgi URLs? For the moment our criterion is 1.1699 + # 1) HTTP_USER_AGENT=Lynx* and 2) HTTP_HOST is unset. 1.1700 +-AGENT="${HTTP_USER_AGENT-unknown}" 1.1701 ++AGENT="${HTTP_USER_AGENT:-unknown}" 1.1702 + 1.1703 + case "$AGENT" in 1.1704 + Lynx*|lynx*) 1.1705 +- HH="${HTTP_HOST-nohh}" 1.1706 ++ HH="${HTTP_HOST:-nohh}" 1.1707 + SED="s/%lynx //" 1.1708 + ;; 1.1709 + *) 1.1710 +@@ -21,7 +21,7 @@ 1.1711 + ;; 1.1712 + esac 1.1713 + 1.1714 +-SERVER="${SERVER_NAME-localhost}" 1.1715 ++SERVER="${SERVER_NAME:-localhost}" 1.1716 + case "$HH" in 1.1717 + nohh) 1.1718 + LL="-l" 1.1719 +--- a/scripts/cgi-bin/man/mansearch 1.1720 ++++ b/scripts/cgi-bin/man/mansearch 1.1721 +@@ -7,11 +7,11 @@ 1.1722 + 1.1723 + # Do we need lynxcgi URLs? For the moment our criterion is 1.1724 + # 1) HTTP_USER_AGENT=Lynx* and 2) HTTP_HOST is unset. 1.1725 +-AGENT="${HTTP_USER_AGENT-unknown}" 1.1726 ++AGENT="${HTTP_USER_AGENT:-unknown}" 1.1727 + 1.1728 + case "$AGENT" in 1.1729 + Lynx*|lynx*) 1.1730 +- HH="${HTTP_HOST-nohh}" 1.1731 ++ HH="${HTTP_HOST:-nohh}" 1.1732 + SED="s/%lynx //" 1.1733 + ;; 1.1734 + *) 1.1735 +@@ -20,7 +20,7 @@ 1.1736 + ;; 1.1737 + esac 1.1738 + 1.1739 +-SERVER="${SERVER_NAME-localhost}" 1.1740 ++SERVER="${SERVER_NAME:-localhost}" 1.1741 + case "$HH" in 1.1742 + nohh) 1.1743 + CG="lynxcgi:/usr/lib/cgi-bin/man" 1.1744 +--- a/scripts/cgi-bin/man/mansearchhelp 1.1745 ++++ b/scripts/cgi-bin/man/mansearchhelp 1.1746 +@@ -4,17 +4,17 @@ 1.1747 + 1.1748 + # Do we need lynxcgi URLs? For the moment our criterion is 1.1749 + # 1) HTTP_USER_AGENT=Lynx* and 2) HTTP_HOST is unset. 1.1750 +-AGENT="${HTTP_USER_AGENT-unknown}" 1.1751 ++AGENT="${HTTP_USER_AGENT:-unknown}" 1.1752 + case "$AGENT" in 1.1753 + Lynx*|lynx*) 1.1754 +- HH="${HTTP_HOST-nohh}" 1.1755 ++ HH="${HTTP_HOST:-nohh}" 1.1756 + ;; 1.1757 + *) 1.1758 + HH=nolynx 1.1759 + ;; 1.1760 + esac 1.1761 + 1.1762 +-SERVER="${SERVER_NAME-localhost}" 1.1763 ++SERVER="${SERVER_NAME:-localhost}" 1.1764 + case "$HH" in 1.1765 + nohh) 1.1766 + CG="lynxcgi:/usr/lib/cgi-bin/man" 1.1767 +--- a/strdefs.c 1.1768 ++++ b/strdefs.c 1.1769 +@@ -27,266 +27,333 @@ 1.1770 + { V('.','V'), 1, 0, NULL }, /* the me package tests for this */ 1.1771 + { 0, 0, 0, NULL } }; 1.1772 + 1.1773 ++ 1.1774 ++/* Characters written according to http://mdocml.bsd.lv/man/mandoc_char.7.html */ 1.1775 ++ 1.1776 + static STRDEF standardstring[] = { 1.1777 +- { V('<','='), 2, "<=", NULL }, /* less equal */ 1.1778 +- { V('>','='), 2, ">=;", NULL }, /* greather equal */ 1.1779 +- { V('A','m'), 1, "&", NULL }, /* infinity */ 1.1780 +- { V('B','a'), 1, "|", NULL }, /* vartical bar */ 1.1781 +- { V('G','e'), 2, ">=;", NULL }, /* greather equal */ 1.1782 +- { V('G','t'), 1, ">", NULL }, /* greather than */ 1.1783 +- { V('I','f'), 1, "∞", NULL }, /* infinity */ 1.1784 +- { V('L','e'), 2, "<=", NULL }, /* less equal */ 1.1785 +- { V('L','q'), 1, "“", NULL }, /* left double quote */ 1.1786 +- { V('L','t'), 1, "<", NULL }, /* less than */ 1.1787 +- { V('N','a'), 3, "NaN", NULL }, /* not a number */ 1.1788 +- { V('N','e'), 2, "!=", NULL }, /* not equal */ 1.1789 +- { V('P','i'), 2, "Pi", NULL }, /* pi */ 1.1790 +- { V('P','m'), 1, "±", NULL }, /* plus minus */ 1.1791 +- { V('R',' '), 1, "®", NULL }, 1.1792 +- { V('R','q'), 1, "”", NULL }, /* right double quote */ 1.1793 +- { V('a','a'), 1, "'", NULL }, /* accute accent */ 1.1794 +- { V('g','a'), 1, "`", NULL }, /* grave accent */ 1.1795 +- { V('l','q'), 2, "``", NULL }, 1.1796 +- { V('q',' '), 1, """, NULL }, /* straight double quote */ 1.1797 +- { V('r','q'), 2, "''", NULL }, 1.1798 +- { V('u','a'), 1, "^", NULL }, /* upwards arrow */ 1.1799 ++ { V('<','='), 1, "≤", NULL }, /* less-than-equal */ 1.1800 ++ { V('>','='), 1, "≥", NULL }, /* greater-than-equal */ 1.1801 ++ { V('A','i'), 4, "ANSI", NULL }, /* ANSI standard name */ 1.1802 ++ { V('A','m'), 1, "&", NULL }, /* ampersand */ 1.1803 ++ { V('B','a'), 1, "|", NULL }, /* vertical bar */ 1.1804 ++ { V('G','e'), 1, "≥", NULL }, /* greater-than-equal */ 1.1805 ++ { V('G','t'), 1, ">", NULL }, /* greater-than */ 1.1806 ++ { V('I','f'), 8, "infinity", NULL }, /* infinity */ 1.1807 ++ { V('L','e'), 1, "≤", NULL }, /* less-than-equal */ 1.1808 ++ { V('L','q'), 1, "“", NULL }, /* left-double-quote */ 1.1809 ++ { V('L','t'), 1, "<", NULL }, /* less-than */ 1.1810 ++ { V('N','a'), 3, "NaN", NULL }, /* NaN */ 1.1811 ++ { V('N','e'), 1, "≠", NULL }, /* not equal */ 1.1812 ++ { V('P','i'), 2, "pi", NULL }, /* pi */ 1.1813 ++ { V('P','m'), 1, "±", NULL }, /* plus-minus */ 1.1814 ++ { V('P','x'), 5, "POSIX", NULL }, /* POSIX standard name */ 1.1815 ++ { V('R',' '), 1, "®", NULL }, /* restricted mark */ 1.1816 ++ { V('R','q'), 1, "”", NULL }, /* right-double-quote */ 1.1817 ++ { V('T','m'), 4, "(Tm)", NULL }, /* trade mark */ 1.1818 ++ { V('a','a'), 1, "´", NULL }, /* acute */ 1.1819 ++ { V('g','a'), 1, "`", NULL }, /* grave */ 1.1820 ++ { V('l','p'), 1, "(", NULL }, /* left-parenthesis */ 1.1821 ++ { V('l','q'), 1, "“", NULL }, /* left double-quote */ 1.1822 ++ { V('q',' '), 1, """, NULL }, /* double-quote */ 1.1823 ++ { V('r','p'), 1, ")", NULL }, /* right-parenthesis */ 1.1824 ++ { V('r','q'), 1, "”", NULL }, /* right double-quote */ 1.1825 ++ { V('u','a'), 1, "↑", NULL }, /* up-arrow */ 1.1826 ++ { V('v','a'), 1, "↕", NULL }, /* up-down arrow */ 1.1827 + { 0, 0, NULL, NULL} 1.1828 + }; 1.1829 + 1.1830 + static STRDEF standardchar[] = { 1.1831 +- { V('*','*'), 1, "*", NULL }, /* math star */ 1.1832 +- { V('*','A'), 1, "Α", NULL }, 1.1833 +- { V('*','B'), 1, "Β", NULL }, 1.1834 +- { V('*','C'), 1, "Ξ", NULL }, 1.1835 +- { V('*','D'), 1, "Δ", NULL }, 1.1836 +- { V('*','E'), 1, "Ε", NULL }, 1.1837 +- { V('*','F'), 1, "Φ", NULL }, 1.1838 +- { V('*','G'), 1, "Γ", NULL }, 1.1839 +- { V('*','H'), 1, "Θ", NULL }, 1.1840 +- { V('*','I'), 1, "Ι", NULL }, 1.1841 +- { V('*','K'), 1, "Κ", NULL }, 1.1842 +- { V('*','L'), 1, "Λ", NULL }, 1.1843 +- { V('*','M'), 1, "Μ", NULL }, 1.1844 +- { V('*','N'), 1, "Ν", NULL }, 1.1845 +- { V('*','O'), 1, "Ο", NULL }, 1.1846 +- { V('*','P'), 1, "Π", NULL }, 1.1847 +- { V('*','Q'), 1, "Ψ", NULL }, 1.1848 +- { V('*','R'), 1, "Ρ", NULL }, 1.1849 +- { V('*','S'), 1, "Σ", NULL }, 1.1850 +- { V('*','T'), 1, "Τ", NULL }, 1.1851 +- { V('*','U'), 1, "Υ", NULL }, 1.1852 +- { V('*','W'), 1, "Ω", NULL }, 1.1853 +- { V('*','X'), 1, "Χ", NULL }, 1.1854 +- { V('*','Y'), 1, "Η", NULL }, 1.1855 +- { V('*','Z'), 1, "Ζ", NULL }, 1.1856 +- { V('*','a'), 1, "α", NULL }, 1.1857 +- { V('*','b'), 1, "β", NULL }, 1.1858 +- { V('*','c'), 1, "ξ", NULL }, 1.1859 +- { V('*','d'), 1, "δ", NULL }, 1.1860 +- { V('*','e'), 1, "ε", NULL }, 1.1861 +- { V('*','f'), 1, "φ", NULL }, 1.1862 +- { V('*','g'), 1, "γ", NULL }, 1.1863 +- { V('*','h'), 1, "θ", NULL }, 1.1864 +- { V('*','i'), 1, "ι", NULL }, 1.1865 +- { V('*','k'), 1, "κ", NULL }, 1.1866 +- { V('*','l'), 1, "λ", NULL }, 1.1867 +- { V('*','m'), 1, "μ", NULL }, 1.1868 +- { V('*','n'), 1, "ν", NULL }, 1.1869 +- { V('*','o'), 1, "ο", NULL }, 1.1870 +- { V('*','p'), 1, "π", NULL }, 1.1871 +- { V('*','q'), 1, "ψ", NULL }, 1.1872 +- { V('*','r'), 1, "ρ", NULL }, 1.1873 +- { V('*','s'), 1, "σ", NULL }, 1.1874 +- { V('*','t'), 1, "τ", NULL }, 1.1875 +- { V('*','u'), 1, "υ", NULL }, 1.1876 +- { V('*','w'), 1, "ω", NULL }, 1.1877 +- { V('*','x'), 1, "χ", NULL }, 1.1878 +- { V('*','y'), 1, "η", NULL }, 1.1879 +- { V('*','z'), 1, "ζ", NULL }, 1.1880 +- { V('\'','A'), 1, "Á", NULL }, 1.1881 +- { V('\'','E'), 1, "É", NULL }, 1.1882 +- { V('\'','I'), 1, "Í", NULL }, 1.1883 +- { V('\'','O'), 1, "Ó", NULL }, 1.1884 +- { V('\'','U'), 1, "Ú", NULL }, 1.1885 +- { V('\'','Y'), 1, "Ý", NULL }, 1.1886 +- { V('\'','a'), 1, "á", NULL }, 1.1887 +- { V('\'','e'), 1, "é", NULL }, 1.1888 +- { V('\'','i'), 1, "í", NULL }, 1.1889 +- { V('\'','o'), 1, "ó", NULL }, 1.1890 +- { V('\'','u'), 1, "ú", NULL }, 1.1891 +- { V('\'','y'), 1, "ý", NULL }, 1.1892 +- { V('!','='), 1, "≠", NULL }, 1.1893 +- { V('%','0'), 1, "‰", NULL }, 1.1894 +- { V('+','-'), 1, "±", NULL }, 1.1895 +- { V(',','C'), 1, "Ç", NULL }, 1.1896 +- { V(',','c'), 1, "ç", NULL }, 1.1897 +- { V('-','>'), 1, "→", NULL }, 1.1898 +- { V('-','D'), 1, "Ð", NULL }, 1.1899 +- { V('.','i'), 1, "ı", NULL }, 1.1900 +- { V('/','L'), 1, "Ł", NULL }, 1.1901 +- { V('/','O'), 1, "Ø", NULL }, 1.1902 +- { V('/','l'), 1, "ł", NULL }, 1.1903 +- { V('/','o'), 1, "ø", NULL }, 1.1904 +- { V('1','2'), 1, "½", NULL }, 1.1905 +- { V('1','4'), 1, "¼", NULL }, 1.1906 +- { V('3','4'), 1, "¾", NULL }, 1.1907 +- { V(':','A'), 1, "Ä", NULL }, 1.1908 +- { V(':','E'), 1, "Ë", NULL }, 1.1909 +- { V(':','I'), 1, "Ï", NULL }, 1.1910 +- { V(':','O'), 1, "Ö", NULL }, 1.1911 +- { V(':','U'), 1, "Ü", NULL }, 1.1912 +- { V(':','a'), 1, "ä", NULL }, 1.1913 +- { V(':','e'), 1, "ë", NULL }, 1.1914 +- { V(':','i'), 1, "ï", NULL }, 1.1915 +- { V(':','o'), 1, "ö", NULL }, 1.1916 +- { V(':','u'), 1, "ü", NULL }, 1.1917 +- { V(':','y'), 1, "ÿ", NULL }, 1.1918 +- { V('<','-'), 1, "←", NULL }, 1.1919 +- { V('<','='), 1, "≤", NULL }, 1.1920 +- { V('<','>'), 1, "↔", NULL }, 1.1921 +- { V('=','='), 1, "≡", NULL }, 1.1922 +- { V('=','~'), 1, "≅", NULL }, 1.1923 +- { V('>','='), 1, "≥", NULL }, 1.1924 +- { V('A','E'), 1, "Æ", NULL }, 1.1925 +- { V('A','h'), 1, "&alepfsym;", NULL }, 1.1926 +- { V('C','R'), 1, "␍", NULL }, 1.1927 +- { V('C','s'), 1, "¤", NULL }, 1.1928 +- { V('D','o'), 1, "$", NULL }, 1.1929 +- { V('E','u'), 1, "€", NULL }, 1.1930 +- { V('F','c'), 1, "»", NULL }, 1.1931 +- { V('F','i'), 3, "ffi", NULL }, 1.1932 +- { V('F','l'), 3, "ffl", NULL }, 1.1933 +- { V('F','o'), 1, "«", NULL }, 1.1934 +- { V('O','E'), 1, "Œ", NULL }, 1.1935 +- { V('P','o'), 1, "£", NULL }, 1.1936 +- { V('S','1'), 1, "¹", NULL }, 1.1937 +- { V('S','2'), 1, "²", NULL }, 1.1938 +- { V('S','3'), 1, "³", NULL }, 1.1939 +- { V('S','d'), 1, "ð", NULL }, 1.1940 +- { V('T','P'), 1, "Þ", NULL }, 1.1941 +- { V('T','p'), 1, "þ", NULL }, 1.1942 +- { V('Y','e'), 1, "¥", NULL }, 1.1943 +- { V('^','A'), 1, "Â", NULL }, 1.1944 +- { V('^','E'), 1, "Ê", NULL }, 1.1945 +- { V('^','I'), 1, "Î", NULL }, 1.1946 +- { V('^','O'), 1, "Ô", NULL }, 1.1947 +- { V('^','U'), 1, "Û", NULL }, 1.1948 +- { V('^','a'), 1, "â", NULL }, 1.1949 +- { V('^','e'), 1, "ê", NULL }, 1.1950 +- { V('^','i'), 1, "î", NULL }, 1.1951 +- { V('^','o'), 1, "ô", NULL }, 1.1952 +- { V('^','u'), 1, "û", NULL }, 1.1953 +- { V('`','A'), 1, "À", NULL }, 1.1954 +- { V('`','E'), 1, "È", NULL }, 1.1955 +- { V('`','I'), 1, "Ì", NULL }, 1.1956 +- { V('`','O'), 1, "Ò", NULL }, 1.1957 +- { V('`','U'), 1, "Ù", NULL }, 1.1958 +- { V('`','a'), 1, "à", NULL }, 1.1959 +- { V('`','e'), 1, "è", NULL }, 1.1960 +- { V('`','i'), 1, "ì", NULL }, 1.1961 +- { V('`','o'), 1, "ò", NULL }, 1.1962 +- { V('`','u'), 1, "ù", NULL }, 1.1963 +- { V('a','a'), 1, "´", NULL }, 1.1964 +- { V('a','e'), 1, "æ", NULL }, 1.1965 +- { V('a','p'), 1, "≈", NULL }, 1.1966 +- { V('a','q'), 1, "'", NULL }, 1.1967 +- { V('a','t'), 1, "@", NULL }, 1.1968 +- { V('a','~'), 1, "~", NULL }, 1.1969 +- { V('b','a'), 1, "|", NULL }, 1.1970 +- { V('b','b'), 1, "|", NULL }, 1.1971 +- { V('b','r'), 1, "|", NULL }, 1.1972 +- { V('b','r'), 1, "|", NULL }, 1.1973 +- { V('b','u'), 1, "•", NULL }, 1.1974 +- { V('b','v'), 1, "|", NULL }, 1.1975 +- { V('c','*'), 1, "⊗", NULL }, 1.1976 +- { V('c','+'), 1, "⊕", NULL }, 1.1977 +- { V('c','i'), 1, "○", NULL }, 1.1978 +- { V('c','o'), 1, "©", NULL }, 1.1979 +- { V('c','q'), 1, "'", NULL }, 1.1980 +- { V('c','t'), 1, "¢", NULL }, 1.1981 +- { V('d','A'), 1, "⇓", NULL }, 1.1982 +- { V('d','a'), 1, "↓", NULL }, 1.1983 +- { V('d','d'), 1, "=", NULL }, 1.1984 +- { V('d','e'), 1, "°", NULL }, 1.1985 +- { V('d','g'), 1, "-", NULL }, 1.1986 +- { V('d','i'), 1, "÷", NULL }, 1.1987 +- { V('d','q'), 1, """, NULL }, 1.1988 +- { V('e','m'), 3, "---", NULL }, /* em dash */ 1.1989 +- { V('e','n'), 1, "-", NULL }, /* en dash */ 1.1990 +- { V('e','q'), 1, "=", NULL }, 1.1991 +- { V('e','s'), 1, "Ø", NULL }, 1.1992 +- { V('e','u'), 1, "€", NULL }, 1.1993 +- { V('f','/'), 1, "⁄", NULL }, 1.1994 +- { V('f','c'), 1, "›", NULL }, 1.1995 +- { V('f','f'), 2, "ff", NULL }, 1.1996 +- { V('f','i'), 2, "fi", NULL }, 1.1997 +- { V('f','l'), 2, "fl", NULL }, 1.1998 +- { V('f','m'), 1, "´", NULL }, 1.1999 +- { V('f','o'), 1, "‹", NULL }, 1.2000 +- { V('g','a'), 1, "`", NULL }, 1.2001 +- { V('h','A'), 1, "⇔", NULL }, 1.2002 +- { V('h','y'), 1, "-", NULL }, 1.2003 +- { V('i','f'), 1, "∞", NULL }, 1.2004 +- { V('i','s'), 8, "Integral", NULL }, /* integral sign */ 1.2005 +- { V('l','A'), 1, "⇐", NULL }, 1.2006 +- { V('l','B'), 1, "[", NULL }, 1.2007 +- { V('l','C'), 1, "{", NULL }, 1.2008 +- { V('l','a'), 1, "<", NULL }, 1.2009 +- { V('l','b'), 1, "[", NULL }, 1.2010 +- { V('l','c'), 2, "|¯", NULL }, 1.2011 +- { V('l','f'), 2, "|_", NULL }, 1.2012 +- { V('l','h'), 1, "☚", NULL }, 1.2013 +- { V('l','k'), 1, "<FONT SIZE=\"+2\">{</FONT>", NULL }, 1.2014 +- { V('l','q'), 1, "\"", NULL }, 1.2015 +- { V('l','z'), 1, "◊", NULL }, 1.2016 +- { V('m','c'), 1, "µ", NULL }, 1.2017 +- { V('m','i'), 1, "-", NULL }, 1.2018 +- { V('m','u'), 1, "×", NULL }, 1.2019 +- { V('n','o'), 1, "¬", NULL }, 1.2020 +- { V('o','A'), 1, "Å", NULL }, 1.2021 +- { V('o','a'), 1, "å", NULL }, 1.2022 +- { V('o','e'), 1, "œ", NULL }, 1.2023 +- { V('o','q'), 1, "'", NULL }, 1.2024 +- { V('o','r'), 1, "|", NULL }, 1.2025 +- { V('p','d'), 1, "d", NULL }, /* partial derivative */ 1.2026 +- { V('p','l'), 1, "+", NULL }, 1.2027 +- { V('p','s'), 1, "¶", NULL }, 1.2028 +- { V('r','!'), 1, "¡", NULL }, 1.2029 +- { V('r','?'), 1, "¿", NULL }, 1.2030 +- { V('r','A'), 1, "⇒", NULL }, 1.2031 +- { V('r','B'), 1, "]", NULL }, 1.2032 +- { V('r','C'), 1, "}", NULL }, 1.2033 +- { V('r','a'), 1, ">", NULL }, 1.2034 +- { V('r','c'), 2, "¯|", NULL }, 1.2035 +- { V('r','f'), 2, "_|", NULL }, 1.2036 +- { V('r','g'), 1, "®", NULL }, 1.2037 +- { V('r','h'), 1, "☛", NULL }, 1.2038 +- { V('r','k'), 1, "<FONT SIZE=\"+2\">}</FONT>", NULL }, 1.2039 +- { V('r','n'), 1, "¯", NULL }, 1.2040 +- { V('r','q'), 1, "\"", NULL }, 1.2041 +- { V('r','s'), 1, "\\", NULL }, 1.2042 +- { V('r','u'), 1, "_", NULL }, 1.2043 +- { V('s','c'), 1, "§", NULL }, 1.2044 +- { V('s','h'), 1, "#", NULL }, 1.2045 +- { V('s','l'), 1, "/", NULL }, 1.2046 +- { V('s','q'), 1, "□", NULL }, 1.2047 +- { V('s','s'), 1, "ß", NULL }, 1.2048 +- { V('t','f'), 1, "∴", NULL }, 1.2049 +- { V('t','i'), 1, "~", NULL }, 1.2050 +- { V('t','m'), 1, "™", NULL }, 1.2051 +- { V('t','s'), 1, "s", NULL }, /* should be terminal sigma */ 1.2052 +- { V('u','A'), 1, "⇑", NULL }, 1.2053 +- { V('u','a'), 1, "↑", NULL }, 1.2054 +- { V('u','l'), 1, "_", NULL }, 1.2055 +- { V('~','A'), 1, "Ã", NULL }, 1.2056 +- { V('~','N'), 1, "Ñ", NULL }, 1.2057 +- { V('~','O'), 1, "Õ", NULL }, 1.2058 +- { V('~','a'), 1, "ã", NULL }, 1.2059 +- { V('~','n'), 1, "ñ", NULL }, 1.2060 +- { V('~','o'), 1, "õ", NULL }, 1.2061 ++ { V('*','*'), 1, "∗", NULL }, /* asterisk */ 1.2062 ++ { V('*','A'), 1, "Α", NULL }, /* Alpha */ 1.2063 ++ { V('*','B'), 1, "Β", NULL }, /* Beta */ 1.2064 ++ { V('*','C'), 1, "Ξ", NULL }, /* Xi */ 1.2065 ++ { V('*','D'), 1, "Δ", NULL }, /* Delta */ 1.2066 ++ { V('*','E'), 1, "Ε", NULL }, /* Epsilon */ 1.2067 ++ { V('*','F'), 1, "Φ", NULL }, /* Phi */ 1.2068 ++ { V('*','G'), 1, "Γ", NULL }, /* Gamma */ 1.2069 ++ { V('*','H'), 1, "Θ", NULL }, /* Theta */ 1.2070 ++ { V('*','I'), 1, "Ι", NULL }, /* Iota */ 1.2071 ++ { V('*','K'), 1, "Κ", NULL }, /* Kappa */ 1.2072 ++ { V('*','L'), 1, "Λ", NULL }, /* Lambda */ 1.2073 ++ { V('*','M'), 1, "Μ", NULL }, /* Mu */ 1.2074 ++ { V('*','N'), 1, "Ν", NULL }, /* Nu */ 1.2075 ++ { V('*','O'), 1, "Ο", NULL }, /* Omicron */ 1.2076 ++ { V('*','P'), 1, "Π", NULL }, /* Pi */ 1.2077 ++ { V('*','Q'), 1, "Ψ", NULL }, /* Psi */ 1.2078 ++ { V('*','R'), 1, "Ρ", NULL }, /* Rho */ 1.2079 ++ { V('*','S'), 1, "Σ", NULL }, /* Sigma */ 1.2080 ++ { V('*','T'), 1, "Τ", NULL }, /* Tau */ 1.2081 ++ { V('*','U'), 1, "Υ", NULL }, /* Upsilon */ 1.2082 ++ { V('*','W'), 1, "Ω", NULL }, /* Omega */ 1.2083 ++ { V('*','X'), 1, "Χ", NULL }, /* Chi */ 1.2084 ++ { V('*','Y'), 1, "Η", NULL }, /* Eta */ 1.2085 ++ { V('*','Z'), 1, "Ζ", NULL }, /* Zeta */ 1.2086 ++ { V('*','a'), 1, "α", NULL }, /* alpha */ 1.2087 ++ { V('*','b'), 1, "β", NULL }, /* beta */ 1.2088 ++ { V('*','c'), 1, "ξ", NULL }, /* xi */ 1.2089 ++ { V('*','d'), 1, "δ", NULL }, /* delta */ 1.2090 ++ { V('*','e'), 1, "ε", NULL }, /* epsilon */ 1.2091 ++ { V('*','f'), 1, "φ", NULL }, /* phi */ 1.2092 ++ { V('*','g'), 1, "γ", NULL }, /* gamma */ 1.2093 ++ { V('*','h'), 1, "θ", NULL }, /* theta */ 1.2094 ++ { V('*','i'), 1, "ι", NULL }, /* iota */ 1.2095 ++ { V('*','k'), 1, "κ", NULL }, /* kappa */ 1.2096 ++ { V('*','l'), 1, "λ", NULL }, /* lambda */ 1.2097 ++ { V('*','m'), 1, "μ", NULL }, /* mu */ 1.2098 ++ { V('*','n'), 1, "ν", NULL }, /* nu */ 1.2099 ++ { V('*','o'), 1, "ο", NULL }, /* omicron */ 1.2100 ++ { V('*','p'), 1, "π", NULL }, /* pi */ 1.2101 ++ { V('*','q'), 1, "ψ", NULL }, /* psi */ 1.2102 ++ { V('*','r'), 1, "ρ", NULL }, /* rho */ 1.2103 ++ { V('*','s'), 1, "σ", NULL }, /* sigma */ 1.2104 ++ { V('*','t'), 1, "τ", NULL }, /* tau */ 1.2105 ++ { V('*','u'), 1, "υ", NULL }, /* upsilon */ 1.2106 ++ { V('*','w'), 1, "ω", NULL }, /* omega */ 1.2107 ++ { V('*','x'), 1, "χ", NULL }, /* chi */ 1.2108 ++ { V('*','y'), 1, "η", NULL }, /* eta */ 1.2109 ++ { V('*','z'), 1, "ζ", NULL }, /* zeta */ 1.2110 ++ { V('\'','A'), 1, "Á", NULL }, /* acute A */ 1.2111 ++ { V('\'','E'), 1, "É", NULL }, /* acute E */ 1.2112 ++ { V('\'','I'), 1, "Í", NULL }, /* acute I */ 1.2113 ++ { V('\'','O'), 1, "Ó", NULL }, /* acute O */ 1.2114 ++ { V('\'','U'), 1, "Ú", NULL }, /* acute U */ 1.2115 ++ { V('\'','Y'), 1, "Ý", NULL }, /* Yacute (*) */ 1.2116 ++ { V('\'','a'), 1, "á", NULL }, /* acute a */ 1.2117 ++ { V('\'','e'), 1, "é", NULL }, /* acute e */ 1.2118 ++ { V('\'','i'), 1, "í", NULL }, /* acute i */ 1.2119 ++ { V('\'','o'), 1, "ó", NULL }, /* acute o */ 1.2120 ++ { V('\'','u'), 1, "ú", NULL }, /* acute u */ 1.2121 ++ { V('\'','y'), 1, "ý", NULL }, /* yacute (*) */ 1.2122 ++ { V('!','='), 1, "≠", NULL }, /* not equal */ 1.2123 ++ { V('%','0'), 1, "‰", NULL }, /* per-thousand */ 1.2124 ++ { V('+','-'), 1, "±", NULL }, /* plus-minus */ 1.2125 ++ { V('+','e'), 1, "ϵ", NULL }, /* epsilon variant */ 1.2126 ++ { V('+','f'), 1, "φ", NULL }, /* phi variant */ 1.2127 ++ { V('+','h'), 1, "ϑ", NULL }, /* theta variant */ 1.2128 ++ { V('+','p'), 1, "ϖ", NULL }, /* pi variant */ 1.2129 ++ { V(',','C'), 1, "Ç", NULL }, /* cedilla C */ 1.2130 ++ { V(',','c'), 1, "ç", NULL }, /* cedilla c */ 1.2131 ++ { V('-','+'), 1, "∓", NULL }, /* minus-plus */ 1.2132 ++ { V('-','>'), 1, "→", NULL }, /* right arrow */ 1.2133 ++ { V('-','D'), 1, "Ð", NULL }, /* Eth */ 1.2134 ++ { V('-','h'), 1, "ℏ", NULL }, /* Planck constant over 2π */ 1.2135 ++ { V('.','i'), 1, "ı", NULL }, /* dotless i */ 1.2136 ++ { V('.','j'), 1, "ȷ", NULL }, /* dotless j */ 1.2137 ++ { V('/','L'), 1, "Ł", NULL }, /* stroke L */ 1.2138 ++ { V('/','O'), 1, "Ø", NULL }, /* stroke O */ 1.2139 ++ { V('/','_'), 1, "∠", NULL }, /* angle */ 1.2140 ++ { V('/','l'), 1, "ł", NULL }, /* stroke l */ 1.2141 ++ { V('/','o'), 1, "ø", NULL }, /* stroke o */ 1.2142 ++ { V('1','2'), 1, "½", NULL }, /* 1/2 (*) */ 1.2143 ++ { V('1','4'), 1, "¼", NULL }, /* 1/4 (*) */ 1.2144 ++ { V('3','4'), 1, "¾", NULL }, /* 3/4 (*) */ 1.2145 ++ { V('3','d'), 1, "∴", NULL }, /* therefore */ 1.2146 ++ { V(':','A'), 1, "Ä", NULL }, /* dieresis A */ 1.2147 ++ { V(':','E'), 1, "Ë", NULL }, /* dieresis E */ 1.2148 ++ { V(':','I'), 1, "Ï", NULL }, /* dieresis I */ 1.2149 ++ { V(':','O'), 1, "Ö", NULL }, /* dieresis O */ 1.2150 ++ { V(':','U'), 1, "Ü", NULL }, /* dieresis U */ 1.2151 ++ { V(':','a'), 1, "ä", NULL }, /* dieresis a */ 1.2152 ++ { V(':','e'), 1, "ë", NULL }, /* dieresis e */ 1.2153 ++ { V(':','i'), 1, "ï", NULL }, /* dieresis i */ 1.2154 ++ { V(':','o'), 1, "ö", NULL }, /* dieresis o */ 1.2155 ++ { V(':','u'), 1, "ü", NULL }, /* dieresis u */ 1.2156 ++ { V(':','y'), 1, "ÿ", NULL }, /* dieresis y */ 1.2157 ++ { V('<','-'), 1, "←", NULL }, /* left arrow */ 1.2158 ++ { V('<','<'), 1, "≪", NULL }, /* much less */ 1.2159 ++ { V('<','='), 1, "≤", NULL }, /* less-than-equal */ 1.2160 ++ { V('<','>'), 1, "↔", NULL }, /* left-right arrow */ 1.2161 ++ { V('=','='), 1, "≡", NULL }, /* equivalent */ 1.2162 ++ { V('=','~'), 1, "≅", NULL }, /* approximately equal */ 1.2163 ++ { V('>','='), 1, "≥", NULL }, /* greater-than-equal */ 1.2164 ++ { V('>','>'), 1, "≫", NULL }, /* much greater */ 1.2165 ++ { V('A','E'), 1, "Æ", NULL }, /* AE ligature */ 1.2166 ++ { V('A','N'), 1, "∧", NULL }, /* logical and */ 1.2167 ++ { V('A','h'), 1, "ℵ", NULL }, /* aleph */ 1.2168 ++ { V('B','q'), 1, "„", NULL }, /* right low double-quote */ 1.2169 ++ { V('C','R'), 1, "↵", NULL }, /* carriage return */ 1.2170 ++ { V('C','s'), 1, "¤", NULL }, /* Scandinavian */ 1.2171 ++ { V('D','o'), 1, "$", NULL }, /* dollar */ 1.2172 ++ { V('E','u'), 1, "€", NULL }, /* Euro symbol */ 1.2173 ++ { V('F','c'), 1, "»", NULL }, /* right guillemet */ 1.2174 ++ { V('F','i'), 1, "ffi", NULL }, /* ffi ligature */ 1.2175 ++ { V('F','l'), 1, "ffl", NULL }, /* ffl ligature */ 1.2176 ++ { V('F','n'), 1, "ƒ", NULL }, /* florin */ 1.2177 ++ { V('F','o'), 1, "«", NULL }, /* left guillemet */ 1.2178 ++ { V('I','J'), 1, "IJ", NULL }, /* IJ ligature */ 1.2179 ++ { V('I','m'), 1, "ℑ", NULL }, /* imaginary */ 1.2180 ++ { V('O','E'), 1, "Œ", NULL }, /* OE ligature */ 1.2181 ++ { V('O','K'), 1, "✓", NULL }, /* check mark */ 1.2182 ++ { V('O','R'), 1, "∨", NULL }, /* logical or */ 1.2183 ++ { V('P','o'), 1, "£", NULL }, /* pound */ 1.2184 ++ { V('R','e'), 1, "ℜ", NULL }, /* real */ 1.2185 ++ { V('S','1'), 1, "¹", NULL }, /* sup1 (*) */ 1.2186 ++ { V('S','2'), 1, "²", NULL }, /* sup2 (*) */ 1.2187 ++ { V('S','3'), 1, "³", NULL }, /* sup3 (*) */ 1.2188 ++ { V('S','d'), 1, "ð", NULL }, /* eth */ 1.2189 ++ { V('T','P'), 1, "Þ", NULL }, /* Thorn */ 1.2190 ++ { V('T','p'), 1, "þ", NULL }, /* thorn */ 1.2191 ++ { V('Y','e'), 1, "¥", NULL }, /* yen */ 1.2192 ++ { V('^','A'), 1, "Â", NULL }, /* circumflex A */ 1.2193 ++ { V('^','E'), 1, "Ê", NULL }, /* circumflex E */ 1.2194 ++ { V('^','I'), 1, "Î", NULL }, /* circumflex I */ 1.2195 ++ { V('^','O'), 1, "Ô", NULL }, /* circumflex O */ 1.2196 ++ { V('^','U'), 1, "Û", NULL }, /* circumflex U */ 1.2197 ++ { V('^','a'), 1, "â", NULL }, /* circumflex a */ 1.2198 ++ { V('^','e'), 1, "ê", NULL }, /* circumflex e */ 1.2199 ++ { V('^','i'), 1, "î", NULL }, /* circumflex i */ 1.2200 ++ { V('^','o'), 1, "ô", NULL }, /* circumflex o */ 1.2201 ++ { V('^','u'), 1, "û", NULL }, /* circumflex u */ 1.2202 ++ { V('`','A'), 1, "À", NULL }, /* grave A */ 1.2203 ++ { V('`','E'), 1, "È", NULL }, /* grave E */ 1.2204 ++ { V('`','I'), 1, "Ì", NULL }, /* grave I */ 1.2205 ++ { V('`','O'), 1, "Ò", NULL }, /* grave O */ 1.2206 ++ { V('`','U'), 1, "Ù", NULL }, /* grave U */ 1.2207 ++ { V('`','a'), 1, "à", NULL }, /* grave a */ 1.2208 ++ { V('`','e'), 1, "è", NULL }, /* grave e */ 1.2209 ++ { V('`','i'), 1, "ì", NULL }, /* grave i */ 1.2210 ++ { V('`','o'), 1, "ò", NULL }, /* grave o */ 1.2211 ++ { V('`','u'), 1, "ù", NULL }, /* grave u */ 1.2212 ++ { V('a','"'), 1, "˝", NULL }, /* Hungarian umlaut */ 1.2213 ++ { V('a','-'), 1, "¯", NULL }, /* macron */ 1.2214 ++ { V('a','.'), 1, "˙", NULL }, /* dotted */ 1.2215 ++ { V('a','^'), 1, "^", NULL }, /* circumflex */ 1.2216 ++ { V('a','a'), 1, "´", NULL }, /* acute */ 1.2217 ++ { V('a','b'), 1, "˘", NULL }, /* breve */ 1.2218 ++ { V('a','c'), 1, "¸", NULL }, /* cedilla */ 1.2219 ++ { V('a','d'), 1, "¨", NULL }, /* dieresis */ 1.2220 ++ { V('a','e'), 1, "æ", NULL }, /* ae ligature */ 1.2221 ++ { V('a','h'), 1, "ˇ", NULL }, /* caron */ 1.2222 ++ { V('a','o'), 1, "˚", NULL }, /* ring */ 1.2223 ++ { V('a','p'), 1, "∼", NULL }, /* tilde operator */ 1.2224 ++ { V('a','q'), 1, "'", NULL }, /* apostrophe quote (text) */ 1.2225 ++ { V('a','t'), 1, "@", NULL }, /* at */ 1.2226 ++ { V('a','~'), 1, "~", NULL }, /* tilde */ 1.2227 ++ { V('b','a'), 1, "|", NULL }, /* bar */ 1.2228 ++ { V('b','b'), 1, "¦", NULL }, /* broken bar */ 1.2229 ++ { V('b','r'), 1, "│", NULL }, /* box rule */ 1.2230 ++ { V('b','q'), 1, "‚", NULL }, /* right low single-quote */ 1.2231 ++ { V('b','u'), 1, "•", NULL }, /* bullet */ 1.2232 ++ { V('b','v'), 1, "⎪", NULL }, /* brace extension */ 1.2233 ++ { V('c','*'), 1, "⊗", NULL }, /* circle-multiply */ 1.2234 ++ { V('c','+'), 1, "⊕", NULL }, /* circle-plus */ 1.2235 ++ { V('c','a'), 1, "∩", NULL }, /* intersection */ 1.2236 ++ { V('c','i'), 1, "○", NULL }, /* circle */ 1.2237 ++ { V('c','o'), 1, "©", NULL }, /* copyright */ 1.2238 ++ { V('c','q'), 1, "’", NULL }, /* right single-quote */ 1.2239 ++ { V('c','t'), 1, "¢", NULL }, /* cent */ 1.2240 ++ { V('c','u'), 1, "∪", NULL }, /* union */ 1.2241 ++ { V('d','A'), 1, "⇓", NULL }, /* down double-arrow */ 1.2242 ++ { V('d','a'), 1, "↓", NULL }, /* down arrow */ 1.2243 ++ { V('d','d'), 1, "‡", NULL }, /* double dagger */ 1.2244 ++ { V('d','e'), 1, "°", NULL }, /* degree */ 1.2245 ++ { V('d','g'), 1, "†", NULL }, /* dagger */ 1.2246 ++ { V('d','i'), 1, "÷", NULL }, /* divide */ 1.2247 ++ { V('d','q'), 1, "\"", NULL }, /* double quote (text) */ 1.2248 ++ { V('e','m'), 1, "—", NULL }, /* em-dash */ 1.2249 ++ { V('e','n'), 1, "–", NULL }, /* en-dash */ 1.2250 ++ { V('e','q'), 1, "=", NULL }, /* equal */ 1.2251 ++ { V('e','s'), 1, "∅", NULL }, /* empty set */ 1.2252 ++ { V('e','u'), 1, "€", NULL }, /* Euro symbol */ 1.2253 ++ { V('f','/'), 1, "⁄", NULL }, /* fraction */ 1.2254 ++ { V('f','a'), 1, "∀", NULL }, /* universal quantifier */ 1.2255 ++ { V('f','c'), 1, "›", NULL }, /* right single guillemet */ 1.2256 ++ { V('f','f'), 1, "ff", NULL }, /* ff ligature */ 1.2257 ++ { V('f','i'), 1, "fi", NULL }, /* fi ligature */ 1.2258 ++ { V('f','l'), 1, "fl", NULL }, /* fl ligature */ 1.2259 ++ { V('f','m'), 1, "′", NULL }, /* minute */ 1.2260 ++ { V('f','o'), 1, "‹", NULL }, /* left single guillemet */ 1.2261 ++ { V('g','a'), 1, "`", NULL }, /* grave */ 1.2262 ++ { V('g','r'), 1, "∇", NULL }, /* gradient */ 1.2263 ++ { V('h','A'), 1, "⇔", NULL }, /* left-right double-arrow */ 1.2264 ++ { V('h','a'), 1, "^", NULL }, /* hat (text) */ 1.2265 ++ { V('h','o'), 1, "˛", NULL }, /* ogonek */ 1.2266 ++ { V('h','y'), 1, "‐", NULL }, /* hyphen */ 1.2267 ++ { V('i','b'), 1, "⊆", NULL }, /* reflexive subset */ 1.2268 ++ { V('i','f'), 1, "∞", NULL }, /* infinity */ 1.2269 ++ { V('i','j'), 1, "ij", NULL }, /* ij ligature */ 1.2270 ++ { V('i','p'), 1, "⊇", NULL }, /* reflexive superset */ 1.2271 ++ { V('i','s'), 1, "∫", NULL }, /* integral */ 1.2272 ++ { V('l','A'), 1, "⇐", NULL }, /* left double-arrow */ 1.2273 ++ { V('l','B'), 1, "[", NULL }, /* left bracket */ 1.2274 ++ { V('l','C'), 1, "{", NULL }, /* left brace */ 1.2275 ++ { V('l','a'), 1, "⟨", NULL }, /* left angle */ 1.2276 ++ { V('l','b'), 1, "⎩", NULL }, /* bottom-left hooked brace */ 1.2277 ++ { V('l','c'), 1, "⌈", NULL }, /* left-ceiling */ 1.2278 ++ { V('l','f'), 1, "⌊", NULL }, /* left-floor */ 1.2279 ++ { V('l','h'), 1, "☜", NULL }, /* left hand */ 1.2280 ++ { V('l','k'), 1, "⎨", NULL }, /* mid-left hooked brace */ 1.2281 ++ { V('l','q'), 1, "“", NULL }, /* left double-quote */ 1.2282 ++ { V('l','t'), 1, "⎧", NULL }, /* top-left hooked brace */ 1.2283 ++ { V('l','z'), 1, "◊", NULL }, /* lozenge */ 1.2284 ++ { V('m','c'), 1, "µ", NULL }, /* micro */ 1.2285 ++ { V('m','i'), 1, "−", NULL }, /* minus */ 1.2286 ++ { V('m','o'), 1, "∈", NULL }, /* element */ 1.2287 ++ { V('m','u'), 1, "×", NULL }, /* multiply */ 1.2288 ++ { V('n','b'), 1, "⊄", NULL }, /* not subset */ 1.2289 ++ { V('n','c'), 1, "⊅", NULL }, /* not superset */ 1.2290 ++ { V('n','e'), 1, "≢", NULL }, /* not equivalent */ 1.2291 ++ { V('n','m'), 1, "∉", NULL }, /* not element */ 1.2292 ++ { V('n','o'), 1, "¬", NULL }, /* logical not */ 1.2293 ++ { V('o','A'), 1, "Å", NULL }, /* ring A */ 1.2294 ++ { V('o','a'), 1, "å", NULL }, /* ring a */ 1.2295 ++ { V('o','e'), 1, "œ", NULL }, /* oe ligature */ 1.2296 ++ { V('o','q'), 1, "‘", NULL }, /* left single-quote */ 1.2297 ++ { V('o','r'), 1, "|", NULL }, /* bitwise or */ 1.2298 ++ { V('p','c'), 1, "·", NULL }, /* center-dot */ 1.2299 ++ { V('p','d'), 1, "∂", NULL }, /* partial differential */ 1.2300 ++ { V('p','l'), 1, "+", NULL }, /* plus */ 1.2301 ++ { V('p','p'), 1, "⊥", NULL }, /* perpendicular */ 1.2302 ++ { V('p','s'), 1, "¶", NULL }, /* paragraph */ 1.2303 ++ { V('p','t'), 1, "∝", NULL }, /* proportionate */ 1.2304 ++ { V('r','!'), 1, "¡", NULL }, /* upside-down exclamation */ 1.2305 ++ { V('r','?'), 1, "¿", NULL }, /* upside-down question */ 1.2306 ++ { V('r','A'), 1, "⇒", NULL }, /* right double-arrow */ 1.2307 ++ { V('r','B'), 1, "]", NULL }, /* right bracket */ 1.2308 ++ { V('r','C'), 1, "}", NULL }, /* right brace */ 1.2309 ++ { V('r','a'), 1, "⟩", NULL }, /* right angle */ 1.2310 ++ { V('r','b'), 1, "⎭", NULL }, /* bottom-right hooked brace */ 1.2311 ++ { V('r','c'), 1, "⌉", NULL }, /* right-ceiling */ 1.2312 ++ { V('r','f'), 1, "⌋", NULL }, /* right-floor */ 1.2313 ++ { V('r','g'), 1, "®", NULL }, /* registered */ 1.2314 ++ { V('r','h'), 1, "☞", NULL }, /* right hand */ 1.2315 ++ { V('r','k'), 1, "⎬", NULL }, /* mid-right hooked brace */ 1.2316 ++ { V('r','l'), 1, "‾", NULL }, /* overline */ 1.2317 ++ { V('r','n'), 1, "‾", NULL }, /* overline */ 1.2318 ++ { V('r','q'), 1, "”", NULL }, /* right double-quote */ 1.2319 ++ { V('r','s'), 1, "\\", NULL }, /* backward slash */ 1.2320 ++ { V('r','t'), 1, "⎫", NULL }, /* top-left hooked brace */ 1.2321 ++ { V('r','u'), 1, "_", NULL }, /* (*) */ 1.2322 ++ { V('s','b'), 1, "⊂", NULL }, /* proper subset */ 1.2323 ++ { V('s','c'), 1, "§", NULL }, /* section */ 1.2324 ++ { V('s','d'), 1, "″", NULL }, /* second */ 1.2325 ++ { V('s','h'), 1, "#", NULL }, /* hash (pound) */ 1.2326 ++ { V('s','l'), 1, "/", NULL }, /* forward slash */ 1.2327 ++ { V('s','p'), 1, "⊃", NULL }, /* proper superset */ 1.2328 ++ { V('s','q'), 1, "□", NULL }, /* white square */ 1.2329 ++ { V('s','r'), 1, "√", NULL }, /* square root */ 1.2330 ++ { V('s','s'), 1, "ß", NULL }, /* German eszett */ 1.2331 ++ { V('s','t'), 1, "∋", NULL }, /* such that */ 1.2332 ++ { V('t','e'), 1, "∃", NULL }, /* existential quantifier */ 1.2333 ++ { V('t','f'), 1, "∴", NULL }, /* therefore */ 1.2334 ++ { V('t','i'), 1, "~", NULL }, /* tilde (text) */ 1.2335 ++ { V('t','m'), 1, "™", NULL }, /* trademarked */ 1.2336 ++ { V('t','s'), 1, "ς", NULL }, /* sigma terminal */ 1.2337 ++ { V('u','A'), 1, "⇑", NULL }, /* up double-arrow */ 1.2338 ++ { V('u','a'), 1, "↑", NULL }, /* up arrow */ 1.2339 ++ { V('u','l'), 1, "_", NULL }, /* underscore */ 1.2340 ++ { V('v','A'), 1, "⇕", NULL }, /* up-down double-arrow */ 1.2341 ++ { V('v','a'), 1, "↕", NULL }, /* up-down arrow */ 1.2342 ++ { V('|','='), 1, "≃", NULL }, /* asymptotically equal */ 1.2343 ++ { V('~','='), 1, "≈", NULL }, /* almost equal */ 1.2344 ++ { V('~','A'), 1, "Ã", NULL }, /* tilde A */ 1.2345 ++ { V('~','N'), 1, "Ñ", NULL }, /* tilde N */ 1.2346 ++ { V('~','O'), 1, "Õ", NULL }, /* tilde O */ 1.2347 ++ { V('~','a'), 1, "ã", NULL }, /* tilde a */ 1.2348 ++ { V('~','n'), 1, "ñ", NULL }, /* tilde n */ 1.2349 ++ { V('~','o'), 1, "õ", NULL }, /* tilde o */ 1.2350 ++ { V('~','~'), 1, "≈", NULL }, /* almost equal */ 1.2351 + { 0, 0, NULL, NULL } 1.2352 +- 1.2353 +- 1.2354 + }; 1.2355 + 1.2356 + void stdinit(void) { 1.2357 +--- /dev/null 1.2358 ++++ b/version.h 1.2359 +@@ -0,0 +1 @@ 1.2360 ++#define version "1.6g-7-slitaz"